我在使用Java时遇到了一个问题:
我的问题似乎是创建的文件都是“打开”的,而且内存不足。实际上每个文件只有大约37 kb,文件数量只有大约2000.我认为它不是太多,但每次都失败了。所以任何人都对这个问题有所了解?非常感谢你!
答案 0 :(得分:2)
问题在于你以错误的方式处理这个过程。 ZIP文件不是通过将每个文件读入内存,压缩它,然后写入输出来构建的。相反,它一次写入一个文件,只有目录列表存储在内存中。在伪代码中,这意味着你正在这样做:
Create Zip Memory Directory
Open Zip File Handle
For Each File In Directory
Open File In Read Mode
Compress File
Write Headers and File To Zip File
Store Info About File in Zip Memory Directory
Close File
End For
Write Zip Memory Directory to Zip File
Close Zip File Handle
这意味着您只需要压缩单个文件所需的内存,并且在任何给定时间只打开两个文件。这部分是因为大多数系统都有有限的空间(“句柄”)来跟踪打开的文件,因此根据语言/操作系统/其他方面,您实际上可能会耗尽平台每个线程/进程/整个文件句柄的限制系统。同样,解压缩通常也一次只能实现一个文件。
在Java中,您实际上可能正在使用Zip实用程序类,读取每个文件,将其压缩到内存中的某个位置,然后关闭该文件,并循环查找其余文件;在整个过程结束时,将Zip文件保存到磁盘。
请参阅ZipOutputStream了解您可以使用的一个类。在实践中,它通过接受OutputStream(通过在写入模式下打开文件创建),然后在循环中调用putNextEntry,write,closeEntry,最后调用close()将文件刷新到磁盘来工作。