2016-02-08 166 views
0

我有一个文件,以.zip格式提供,我想将其读入内存。压缩大约50 MB,解压缩大约700 MB。现在我想知道如果我应该先解压缩文件然后再读取它,或者它没有任何区别,我可以直接从zip文件中读取数据。将压缩文件和解压缩文件读取到内存中

在正常文件的情况下,我使用围绕FileInputStreamInputStreamReader
对于zip文件,我使用java.util.ZipFileZipEntry获取InputStream,然后再围绕它包装InputStreamReader
所以最后我在两种情况下都与InputStreamReader一起工作。

我试图测试它,但本地我无法读取这样一个大文件而不会耗尽内存。在进程运行的服务器上有更多的进程干扰,所以我无法确定是否有任何区别。

有没有人知道,如果其中一个选项使用的内存明显多于另一个,那么它只是一个设计问题,使用哪种方式?

问候, 乌韦

+0

你对解压缩数据做什么?该zipfile有多少条目? – wero

+0

这是您自己机器上的一次性工作,而不是生产工作上的常规工作吗? –

+0

我们确实需要知道您需要如何处理数据。您可以在读取时对其进行过滤,只需要在内存中保存一个小缓冲区和结果 - 或者您可以找到在磁盘上处理它的方法。应始终避免把它全部留在记忆中 - 除非这是一次性的。 –

回答

0

唯一的区别是解压文件小的性能损失。在这两种情况下,您的InputStreamReader将读取解压后的700 MB文件。

你应该问的下一个问题是为什么你需要将这个大文件完全读入内存?它真的有必要吗?也许你可以逐行处理它,而不用在内存中保存所有行。

+0

谢谢你的回应。很高兴听到我的期望正朝着正确的方向前进。我很乐意为这种情况使用流和lambas,但是随着我们的架构的发展,现在这是不可能的。看到我对我的问题的评论。 – uBreckner

+0

为了减少内存消耗,您可以两次处理文件。在第1遍中,您只将组列的值存储在像“Map >'这样的地图中。这些值是包含组列中的键的每行的文件位置。所以用这个你创建一个穷人的索引。在第二遍中,您可以遍历地图,并可以一起读取一组组值的所有行。你需要一个'RandomAccessFile'来将文件指针定位到行首。 – vanje