如何有效地处理300+;scala中并发的文件
我将使用Scala比较大约300个二进制文件,一个字节一个字节,每个4MB。但是,从我已经完成的工作来看,使用java.BufferedInputStream同时处理15个文件在我的机器上需要90秒左右的时间,因此我认为我的解决方案无法很好地扩展到大量文件 非常感谢您的想法和建议如何有效地处理300+;scala中并发的文件,scala,file-io,Scala,File Io,我将使用Scala比较大约300个二进制文件,一个字节一个字节,每个4MB。但是,从我已经完成的工作来看,使用java.BufferedInputStream同时处理15个文件在我的机器上需要90秒左右的时间,因此我认为我的解决方案无法很好地扩展到大量文件 非常感谢您的想法和建议 编辑:实际任务不仅仅是比较差异,而是按照相同的顺序处理这些文件。假设我必须同时查看每个文件中的字节ith,然后转到(ith+1)。您在读取文件时是否注意到硬盘驱动器正在慢慢蒸发?并行读取许多文件不是机械硬盘设计为全速运
编辑:实际任务不仅仅是比较差异,而是按照相同的顺序处理这些文件。假设我必须同时查看每个文件中的字节ith,然后转到(ith+1)。您在读取文件时是否注意到硬盘驱动器正在慢慢蒸发?并行读取许多文件不是机械硬盘设计为全速运行的功能 如果文件总是这么小(4MB足够小),我会将第一个文件全部读入内存,然后将每个文件与它进行系列比较
我不能评论固态驱动器,因为我对它们的性能没有第一手的经验。如果可能的话,我建议使用nio。如果您不熟悉NIO,它似乎是一个不错的使用NIO的指南。我不建议读取文件并逐字节进行比较,如果这是您当前正在做的。您可以创建ByteBuffer从文件中读取数据块,然后进行比较。文件的字节数是否完全相同?如果不是,则可以通过
File.length()
方法简单地比较文件,以确定相等的一阶猜测
当然,你可能想做一个更深入的比较,而不仅仅是“这些文件是一样的吗?”事实上,你完全搞砸了 让我们看看。。。300*4 MB=1.2 GB。这符合你的记忆预算吗?如果是的话,一定要把它们全部读入内存。但是,为了加快速度,您可以尝试以下方法:
Futures
,看看它的伸缩性有多好。根据您的I/O系统的不同,您可以通过同时读取几个文件来获得一些速度,但我不希望它扩展得太多。实验!基准Futures
处理这些512 KBFutures
通过不读取步骤1中的所有文件,您将花费一些时间来读取这些文件,从而完成有用的CPU工作。您也可以尝试降低步骤1中读取的字节数。如果您只是想看看它们是否相同,我建议使用SHA1之类的哈希算法来查看它们是否匹配。 包括国家安全局和 使用散列而不是字节比较更有效。散列也可以存储起来,以便以后查看数据是否被更改
特别是关于Git,它还提到了为什么他使用Sh1../P>取决于你到底在做什么和文件的预期性质(例如,你是否期望它们大部分是相同的,你只需要报告它们的差异吗?你是否将它们与一个主文件进行比较?)你可以考虑首先对每个文件运行哈希校验和。(我的2.6 GHz笔记本电脑占用更少的空间这是正确的答案:如果可能的话,将它们全部读入内存。