Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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
用java划分大文件_Java - Fatal编程技术网

用java划分大文件

用java划分大文件,java,Java,我有超过1GB的大文件,我想搜索某个单词的出现。 所以我想在几个线程上执行任务,每个线程将处理文件的一部分 最好的方法是什么,我考虑将文件读入几个固定大小的缓冲区,并为每个线程传递一个缓冲区 有没有更好的办法 [编辑]我想在不同的设备上执行每个线程将线程读入缓冲区可能需要与执行搜索一样长的时间(与从磁盘上读取文件所需的时间相比,搜索所需的额外处理是微不足道的——事实上,它很可能能够在等待数据的时间内完成这一处理) 在大多数存储系统上,一次搜索文件中的多个位置将非常缓慢 真正的问题是你是否只搜索一

我有超过1GB的大文件,我想搜索某个单词的出现。 所以我想在几个线程上执行任务,每个线程将处理文件的一部分

最好的方法是什么,我考虑将文件读入几个固定大小的缓冲区,并为每个线程传递一个缓冲区

有没有更好的办法


[编辑]我想在不同的设备上执行每个线程

将线程读入缓冲区可能需要与执行搜索一样长的时间(与从磁盘上读取文件所需的时间相比,搜索所需的额外处理是微不足道的——事实上,它很可能能够在等待数据的时间内完成这一处理)

在大多数存储系统上,一次搜索文件中的多个位置将非常缓慢


真正的问题是你是否只搜索一个文件,或者你经常搜索它们。如果只有一次,那么你就没有真正的选择,而是扫描文件,并采取时间。如果你经常这样做,那么你可以考虑索引的内容不知何故。

< P>一个字节缓冲区,说在一个随机存取文件将是可行的。文件<2 GB(231)

一般的解决方案是使用它的
MappedByteBuffer

对于多个缓冲区,必须注意重叠缓冲区,以便可以在缓冲区边界上找到单词。

考虑使用MapReduce


如果要在不同的设备上执行线程(=分割任务),则输入文件应位于分布式文件系统上,如HDFS(Hadoop分布式文件系统).MapReduce是一种将一个作业划分为多个任务并在不同机器上并行运行的机制。

问:您是否考虑过只调用
grep
?它经过了高度优化,可能会比您的实现更好,即使是单线程的。为什么您认为它会更快?一个磁盘只能从一个p读取数据你有没有对单线程方法在这种特殊情况下所需的时间进行基准测试?我之所以这样做是因为我想在并行计算中处理该文件。你为什么要使用并行处理来处理它?我试图做的是将文件块加载到内存中,将该块传递给将在不同的设备上执行,等等,直到我加载整个文件,这是并行编程课程中的一个练习。你所想的会起作用-尽管这样做不会提高性能。为什么不呢?文件的部分将被并行搜索,这不会比顺序搜索带来一些性能提升吗?阿姆达尔定律-如果你只加快进程中已经快的部分,你不会得到任何东西,因为慢的部分仍然很慢。这个文件的加载块是在内存中还是仅仅在硬盘中指向它?现代操作系统支持“分页”,通过这种分页,计算机可以从辅助存储器中存储和检索数据,以便在主存储器中使用。内存映射ping(MappedByteBuffer)是一种分页。如果使用MappedByteBuffer,操作系统会将文件内容映射到内存区域,您可以像访问字节数组一样访问数据。对于大文件,内存映射比通过FileInputStream读取快。将作业划分为线程而不考虑磁盘I/O和网络I/O不会给您带来任何性能增益n、 此外,在只有一个CPU内核的机器上使用线程会“降低”性能。@TakahikoKawasaki解释了所有方面;MappedByteBuffer很快;对于查找一个事件搜索线程仍然可以提高速度,但会增加编程开销。对于查找所有事件,线程会受到磁盘I/O的限制。@JoopEggen非常感谢您的帮助回答。在阅读了有关FileChannel类的oracle文档后,我找到了我要寻找的解决方案。@TakahikoKawasaki感谢您提供的有用提示。将该文件放在一台机器上,但处理将在并行机器上。这是为了学习。如果您在不同的设备上执行任务,尽管输入文件在一台机器上,但每个任务将受到网络I/O的影响。因此,从性能的角度来看,这不是一个好方法。但是,如果您只想学习并行计算,第一步是确定在计算机器之间共享输入文件的方式。NFS是一种传统方式。然后,每个任务线程,确切地说,每个任务“进程”,都应该打开input文件,跳转到分配给任务的位置,然后开始计数。请注意,根据定义,“线程”在一个“进程”中运行。