Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何有效地处理300+;scala中并发的文件_Scala_File Io - Fatal编程技术网

如何有效地处理300+;scala中并发的文件

如何有效地处理300+;scala中并发的文件,scala,file-io,Scala,File Io,我将使用Scala比较大约300个二进制文件,一个字节一个字节,每个4MB。但是,从我已经完成的工作来看,使用java.BufferedInputStream同时处理15个文件在我的机器上需要90秒左右的时间,因此我认为我的解决方案无法很好地扩展到大量文件 非常感谢您的想法和建议 编辑:实际任务不仅仅是比较差异,而是按照相同的顺序处理这些文件。假设我必须同时查看每个文件中的字节ith,然后转到(ith+1)。您在读取文件时是否注意到硬盘驱动器正在慢慢蒸发?并行读取许多文件不是机械硬盘设计为全速运

我将使用Scala比较大约300个二进制文件,一个字节一个字节,每个4MB。但是,从我已经完成的工作来看,使用java.BufferedInputStream同时处理15个文件在我的机器上需要90秒左右的时间,因此我认为我的解决方案无法很好地扩展到大量文件

非常感谢您的想法和建议


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

您在读取文件时是否注意到硬盘驱动器正在慢慢蒸发?并行读取许多文件不是机械硬盘设计为全速运行的功能

如果文件总是这么小(4MB足够小),我会将第一个文件全部读入内存,然后将每个文件与它进行系列比较


我不能评论固态驱动器,因为我对它们的性能没有第一手的经验。

如果可能的话,我建议使用nio。如果您不熟悉NIO,它似乎是一个不错的使用NIO的指南。我不建议读取文件并逐字节进行比较,如果这是您当前正在做的。您可以创建ByteBuffer从文件中读取数据块,然后进行比较。

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


当然,你可能想做一个更深入的比较,而不仅仅是“这些文件是一样的吗?”

事实上,你完全搞砸了

让我们看看。。。300*4 MB=1.2 GB。这符合你的记忆预算吗?如果是的话,一定要把它们全部读入内存。但是,为了加快速度,您可以尝试以下方法:

  • 按顺序读取每个文件的512 KB。你可以试着同时从2读到8,也许可以通过
    Futures
    ,看看它的伸缩性有多好。根据您的I/O系统的不同,您可以通过同时读取几个文件来获得一些速度,但我不希望它扩展得太多。实验!基准

  • 使用
    Futures
    处理这些512 KB

  • 返回到步骤1,除非您已完成文件

  • 从处理中获取结果
    Futures

  • 在步骤1中,通过限制并行读取,可以避免破坏I/O子系统。尽你所能地推动它,也许比那个少一点,但绝对不能超过那个


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

    如果您只是想看看它们是否相同,我建议使用SHA1之类的哈希算法来查看它们是否匹配。

    包括国家安全局和 使用散列而不是字节比较更有效。散列也可以存储起来,以便以后查看数据是否被更改


    特别是关于Git,它还提到了为什么他使用Sh1../P>取决于你到底在做什么和文件的预期性质(例如,你是否期望它们大部分是相同的,你只需要报告它们的差异吗?你是否将它们与一个主文件进行比较?)你可以考虑首先对每个文件运行哈希校验和。(我的2.6 GHz笔记本电脑占用更少的空间这是正确的答案:如果可能的话,将它们全部读入内存。