Отображаемый в память zip-файл в Java - PullRequest
6 голосов
/ 09 марта 2011

Вот проблема, которую я пытаюсь решить:

У меня есть около 100 двоичных файлов (всего 158 КБ, и они примерно одинакового размера +/- 50% друг от друга).Мне нужно выборочно проанализировать только несколько из этих файлов (в худшем случае может быть 50, в других случаях всего от 1 до 5).Кстати, это на устройстве Android.

Какой самый быстрый способ сделать это в Java?

Одним из способов может быть объединение всего в один файл изатем с помощью поиска файла, чтобы добраться до каждого отдельного файла.Таким образом, открытие файла нужно будет вызывать только один раз, и обычно это происходит медленно.Однако, чтобы узнать, где находится каждый файл, в начале файла должна быть какая-то таблица, которую можно сгенерировать с помощью скрипта, но файлы также должны быть проиндексированы в таблице вдля того, чтобы они были объединены, чтобы поиск по файлам не занимал много работы (поправьте меня, если я ошибаюсь).

Лучшим способом было бы отобразить файл в память, и тогда таблица не будет 'не должно быть в порядке сортировки конкатенации, потому что отображенный в память файл будет иметь произвольный доступ (снова исправьте меня, если я ошибаюсь).

Создание этой таблицы было бы ненужным, если бы использовалось сжатие zip, потому что zipСжатие уже составляет таблицу.Кроме того, все файлы не нужно будет объединять.Я мог бы заархивировать каталог, а затем получить доступ к каждому из отдельных файлов по их записям в zip-файле.Проблема решена.

За исключением случаев, когда zip-файл не отображен в памяти, он будет читать медленнее, поскольку системные вызовы медленнее, чем прямой доступ к памяти (поправьте меня, если я ошибаюсь). Итак, я пришел к выводу, что наилучшим решением было бы использовать zip-архив с отображением в памяти.

Однако записи ZipFile возвращают InputStream для чтения содержимогоВход.И для MappedByteBuffer требуется RandomAccessFile, который принимает имя файла в качестве входных данных, а не InputStream.

Есть ли какой-либо способ отобразить в памяти zip-файл для быстрого чтения?Или есть другое решение этой проблемы чтения выбранных файлов?

Спасибо

РЕДАКТИРОВАТЬ: я проверил скорости открытия, закрытия и анализа файлов здесьстатистические данные, которые я нашел:

Number of Files: 25 (24 for parse because garbage collection interrupted timing)
Total Open Time: 72ms
Total Close Time: 1ms
Total Parse Time: 515ms

(это искажено в пользу Parse, потому что Parse отсутствуетфайл)
%Total time Open takes: 12%
%Total time Close takes: 0.17%
%Total time Parse takes: 88%

Avg time Open takes per file: 2.88ms
Avg time Close takes per file: 0.04ms
Avg time Parse takes per file: 21.46ms

1 Ответ

1 голос
/ 09 марта 2011

Я бы сейчас использовал простой API, такой как RandomAccessFile , и, если вам действительно нужно, еще раз вернусь к этой проблеме.

Редактировать - я не знал о MappedByteBuffer.Это похоже на путь.Почему бы не сделать это сначала с отдельными файлами, а потом подумать о том, чтобы объединить их позже?

...