如何在scala中有效地同时处理300多个文件

时间:2009-11-14 04:05:47

标签: scala file-io

我将使用Scala比较大约300个二进制文件,逐个字节,每个4MB。但是,根据我已经完成的工作,使用 java.BufferedInputStream 同时处理15个文件在我的机器上花了大约90秒,所以我认为我的解决方案不会很好地扩展大量文件。

我们非常感谢您的意见和建议。

编辑:实际任务不只是比较差异,而是以相同的顺序处理这些文件。假设我必须同时查看每个文件中的字节 ith ,然后转到(ith + 1)。

5 个答案:

答案 0 :(得分:6)

您是否注意到在阅读文件时硬盘驱动器会慢慢蒸发?并行读取多个文件某些机械硬盘设计为全速运行。

如果文件总是这么小(4MB足够小),我会将整个第一个文件读入内存,然后将每个文件与它串联。

我无法评论固态硬盘,因为我没有第一手的性能经验。

答案 1 :(得分:2)

你确实非常紧张。

让我们看看... 300 * 4 MB = 1.2 GB。这适合你的记忆预算吗?如果是这样,请务必将它们全部读入内存。但是,为了加快速度,您可以尝试以下方法:

  1. 按顺序读取每个文件的512 KB。您可以尝试同时从2到8阅读 - 也许通过Futures,并查看它的扩展程度。根据您的I / O系统,您可以通过同时读取几个文件来获得一些速度,但我不希望它扩展太多。实验! BENCHMARK!

  2. 使用Futures处理这些512 KB。

  3. 返回步骤1,除非您已完成文件。

  4. 从处理Futures获取结果。

  5. 在步骤1中,通过限制并行读取,可以避免丢弃I / O子系统。尽可能多地推动它,可能比它少一点,但绝对不会超过它。

    通过不读取步骤1中的所有文件,您可以花一些时间阅读这些文件,从而完成有用的CPU工作。您也可以尝试降低步骤1中读取的字节数。

答案 2 :(得分:1)

文件的字节数是否完全相同?如果不是,则可以通过File.length()方法简单地比较文件,以确定相等的一阶猜测。

当然,您可能希望进行更深入的比较,而不仅仅是“这些文件是否相同?”

答案 3 :(得分:1)

如果您只是想查看它们是否相同,我建议使用像SHA1这样的散列算法来查看它们是否匹配。 Here is some java source to make that happen

many large systems that handle data use sha1包括国家安全局和git 它更有效地使用哈希而不是字节比较。也可以存储哈希值,以便以后查看数据是否已被更改。

Here is a talk by Linus Torvalds特别关于git,它还提到了为什么他使用SHA1。

答案 4 :(得分:0)

如果可能,我建议使用nio。如果您不熟悉NIO,Introudction To Java NIO and NIO2似乎是使用NIO的合适指南。我不建议读取文件并逐字节进行比较,如果这是你当前正在做的事情。您可以创建一个ByteBuffer来读取文件中的数据块,然后进行比较。