2016-04-27 60 views
1

我正在做一些不寻常的数据操作。我有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的回复之前,我没有考虑过将任何东西保存为文件作为中间步骤。大小是唯一使这个问题变得不重要的东西,我现在看到大小可以分成更小的更易于管理的块。

+0

不确定部分3是什么。你需要解压缩一个文件并将前几个字节追加到一个文件中?为什么要3,000个文件?如果你有超过8台服务器,可以使用hadoop – tgkprog

+0

对于一个给定的运行,输入都是相同的大小,但运行之间的大小可能非常大,文件数量也非常大。如果它是每个1MB和36000个文件,那么它将是一个36GB的文件,这是事情的低端。然后我可以以一种非常可预见的方式读取该文件。我需要的每个字节都是1MB(一个输入文件的大小),但要记住把它组合成一个大文件的时间,这真的快得多吗?它会加载并卸载36个演出的每个字节到内存中,以完成1个文件。它会这样做100万次。 –

回答

5

三相操作:

第一阶段:读取所有输入文件,一次一个,并写入到输出文件。输出文件将以记录为导向 - 比如8个字节的记录,4个字节的“字符偏移量”和4个字节的“字符码点”。当你读文件时,字符偏移量从0开始,当然,如果输入文件是“ABCD”,你正在写(0,A)(1,B)(2,C)(3,D) 。每个输入文件打开一次,顺序读取并关闭。输出文件打开一次,连续写入,然后关闭。

第二阶段:使用外部排序对4字节字符偏移量字段上的中间文件的8字节记录进行排序。

第三阶段:打开已排序的中间文件,并通过它。每次字符索引字段更改时打开一个新的输出文件,并向该输出文件写入属于该索引的所有字符。输入文件打开一次并顺序读取。每个输出文件都打开,按顺序写入,然后关闭。

Voilà!您需要中间文件的空间,以及良好的外部排序(以及工作文件的空间)。

正如@Jorge所言,第一阶段和第二阶段都可以并行化,事实上,这种工作(阶段1到阶段3)完全在mapreduce/hadoop的最佳位置。

2

你在那里很模糊,但是,也许看看mapreduce会有帮助。看起来可以分发这种工作。

随着您提供的额外信息,我真的不知道如何在通用硬件上执行该任务,如您提到的4GB i7。你的问题看起来像一个图像叠加算法,从很多不太好的图像中获得体面的图像,这是天文图像处理中的一个典型问题,我相信它会应用到其他区域。对天文图像处理进行很好的查找可能会很好地利用您的时间,有一种名为registax(不确定它是否仍然存在)的软件可以做类似的事情,但可以使用视频文件。

做一些餐巾数学,如果你花1秒钟打开一个文件,你会得到只有文件打开10小时。

一种方法是获得一些FAST磁盘(SSD),我会将所有文件解压缩为一些原始格式并将它们存储在磁盘上,从那里您将不得不使用文件指针直接从这些文件不会将它们存入内存,并直接在磁盘上将输出写入文件。

+0

感谢指向RegiStax的指针([仍然存在](http://www.astronomie.be/registax/)) - 我完全不知道这类图像处理软件。 – davidbak

+0

很高兴帮助! –