Java中的内存映射zip文件

时间:2011-03-09 19:42:41

标签: java android file-io zip

以下是我要解决的问题:

我有大约100个二进制文件(总共158KB,它们的大小大致相同+/- 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 个答案:

答案 0 :(得分:1)

我现在会使用像RandomAccessFile之类的简单api,如果你真的需要,请重新审视这个问题。

修改 - 我不知道MappedByteBuffer。这似乎是要走的路。为什么不首先使用单独的文件,然后考虑稍后将它们组合起来?

相关问题