Speicherzuordnung eine große Datei auf Android in Java funktioniert gut. Aber wenn insgesamt mehr als ~ 1,5 GB Kartierung auch bei mehreren Mapping nennt es irgendwie:Java mmap schlägt auf Android mit "mmap fehlgeschlagen: ENOMEM (nicht genügend Arbeitsspeicher)"
mmap failed: ENOMEM (Out of memory)
Die gesamte Diskussion here. Hinweis: Es scheitert nicht auf einem Server Linux. Der Android: largeHeap = "true" ist für die Anwendung aktiviert.
Der folgende Java-Code wird ein paar hundert Mal aufgerufen ~ 1MB pro Anruf anfordernden:
ByteBuffer buf = raFile.getChannel().map(allowWrites ? FileChannel.MapMode.READ_WRITE : FileChannel.MapMode.READ_ONLY, offset, byteCount);
zu vermeiden, einen großen zusammenhängenden Speicher chunk anfordert, die gefunden zu werden oft schwieriger ist. Siehe den vollständigen Code here. Denken Sie daran, dass eine Verdopplung der "Segmentgröße" (d. H. Die Größe eines einzelnen Kartenaufrufs) keine Wirkung hat, was bedeutet, dass sie an der gleichen Speicherposition anhält. Es ist auch wichtig zu beachten, dass 2 Apps mit etwas unter dem Limit gut ausgeführt werden (Hinweis auf ein pro Prozesslimit).
Verwandte Fragen sind here, here, here, here, here, here, here und here.
Wird die Verwendung mehrerer Dateien statt einer Datei mit mehreren Zuordnungen helfen?
Ich habe gelesen, dass dies pro Prozesslimit sein könnte für den virtuellen Adressraum. Wo kann ich mehr darüber finden? Kann ich diese Einstellung mit NDK ändern, z. wie anzurufen ulimit
? Könnte mir madvise hier ein bisschen helfen?
aktualisieren
Siehe meine Antwort here für ein Mmap Werkzeug verwendbar in Java
Die einzige Lösung ist wahrscheinlich, einen Upstream-Cache zu implementieren und 'mapIt' bei Bedarf aufzurufen. Aber das Problem ist, wie man diese Teile entmapselt, da es mit Desktop-Java ('mmap cleaner') hackisch ist und mit Android nicht möglich ist? – Karussell
Fragte man dies hier: http://StackOverflow.com/Questions/38315292/Unmapping-or-Release-AmappedByteBuffer-under-android – Karussell