La mappatura della memoria di un file di grandi dimensioni su Android in Java funziona correttamente. Ma quando la mappatura più di ~ 1,5 GB in totale anche con la mappatura più chiamate non riesce con:Java mmap non riesce su Android con "mmap non riuscito: ENOMEM (Memoria insufficiente)"
mmap failed: ENOMEM (Out of memory)
Vedi la discussione completa here. Nota: non fallisce su un server Linux. Android: largeHeap = "true" è abilitato per l'applicazione.
Il seguente codice Java è chiamato a poche centinaia di volte la richiesta ~ 1MB per chiamata:
ByteBuffer buf = raFile.getChannel().map(allowWrites ? FileChannel.MapMode.READ_WRITE : FileChannel.MapMode.READ_ONLY, offset, byteCount);
da evitare chiedendo un grande pezzo memoria contigua che è spesso più difficile da trovare. Vedi il codice completo here. Tieni presente che il raddoppio della "dimensione del segmento" (ovvero la dimensione di una singola chiamata di mappa) non ha alcun effetto, il che significa che si ferma nella posizione di memoria simile. Inoltre è importante notare che 2 app con entrambi leggermente sotto il limite stanno eseguendo bene (suggerendo un limite per processo).
Domande correlate sono here, here, here, here, here, here, here e here.
L'utilizzo di più file invece di un file con più associazioni è utile?
Ho letto che questo potrebbe essere un limite per processo per lo spazio indirizzo virtuale. Dove posso trovare di più su questo? Posso modificare questa impostazione con NDK, ad es. come chiamare ulimit
? Potrebbe madvise aiutarmi un po 'qui?
Aggiornamento
Vedere la mia risposta here per uno strumento di mmap utilizzabile in Java
L'unica soluzione è probabilmente quella di implementare una cache upstream e chiamare 'mapIt' su richiesta. Ma il problema è come rimuovere un mapping di quelle parti in quanto è hackerato con il desktop java ('mmap cleaner') e non è possibile con Android? – Karussell
Chiesto questo qui: http://stackoverflow.com/questions/38315292/unmapping-or-release-a-mappedbytebuffer-under-android – Karussell