我正在做一些不寻常的数据操作。我有36,000个输入文件。然后可以一次加载到内存中。我想把每个文件的第一个字节放在一个输出文件中,然后再次执行第二个文件,依此类推。它不需要以任何特定的顺序来完成。由于输入文件是压缩加载它们需要更长的时间,并且它们不能一次读取1个字节。我最终得到每个输入文件的一个字节数组。阅读成千上万的文件并写入数百万的Java文件
输入文件约为1-6MB未压缩和〜.3-1MB压缩(有损压缩)。输出文件最终成为输入文件的字节数。 ~36KB在我的例子。
我知道ulimit可以在Linux操作系统上进行设置,并且可以在Windows上进行等效设置。尽管可以提高这个数字,但我不认为任何操作系统都会同时写入数百万个文件。
我目前的解决方案是制作3000左右的缓冲写入器流,并依次加载每个输入文件,并将1个字节写入3000个文件,然后关闭文件并加载下一个输入。有了这个系统,每个输入文件需要打开大约500次。
整个操作需要8天才能完成,并且只是一个更实际的应用程序的测试用例,它将以更大的输入文件,更多的输入文件和更多的输出文件结束。
捕获内存中的所有压缩文件,然后根据需要解压缩它们听起来不切实际,并且不会扩展为较大的输入文件。
我认为解决方案是缓冲我可以从输入文件中获得的内容(因为内存约束不允许缓冲所有内容),然后依次写入文件,然后再重复一遍。
但是,我不知道是否有更好的解决方案,使用我不会阅读的东西。
编辑 我很感激快速的回应。我知道我在应用我正在做的事情时含糊不清,我会尽力纠正这一点。我基本上有一个三维数组[图像] [X] [Y]我想遍历每个图像,并保存每个图像上的特定像素的每种颜色,并为所有图像做到这一点。问题是内存限制。 ()DataList.get(fileList.get(k)).getRaster()。getDataBuffer())。getData();方法详细信息
这是我用来加载图像,因为它负责解压缩和跳过标题。
我不会将它编辑为视频,因为我必须获取一个帧,然后将其转换为图像(代价高昂的颜色空间转换),然后将其转换为byte []以获取像素数据int RGB色彩空间。
我可以加载每个图像,并将其分成〜500个部分(Y大小),并写入单独的文件,我保留打开并写入每个图像。输出很容易在演出中。生成的文件可以完全加载到内存中,并转换为用于顺序文件写入的阵列。
中间步骤的确意味着我可以在网络上拆分负载,但我试图在低质量笔记本电脑上使用4gb ram,无GPU和低质量i7完成。
在阅读davidbak的回复之前,我没有考虑过将任何东西保存为文件作为中间步骤。大小是唯一使这个问题变得不重要的东西,我现在看到大小可以分成更小的更易于管理的块。
不确定部分3是什么。你需要解压缩一个文件并将前几个字节追加到一个文件中?为什么要3,000个文件?如果你有超过8台服务器,可以使用hadoop – tgkprog
对于一个给定的运行,输入都是相同的大小,但运行之间的大小可能非常大,文件数量也非常大。如果它是每个1MB和36000个文件,那么它将是一个36GB的文件,这是事情的低端。然后我可以以一种非常可预见的方式读取该文件。我需要的每个字节都是1MB(一个输入文件的大小),但要记住把它组合成一个大文件的时间,这真的快得多吗?它会加载并卸载36个演出的每个字节到内存中,以完成1个文件。它会这样做100万次。 –