划分巨大的文件java

时间:2014-03-27 16:35:55

标签: java

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

执行此操作的最佳方法是什么,我考虑将文件读入几个固定大小的缓冲区并将每个线程传递给缓冲区。

有更好的方法吗

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

3 个答案:

答案 0 :(得分:1)

ByteBuffer,比如说RandomAccessFile对于文件< 2 GB(2 31 )。

一般解决方案是使用FileChannel及其MappedByteBuffer

使用多个缓冲区必须注意重叠缓冲区,因此可以在缓冲区边界找到该字。

答案 1 :(得分:0)

将线程读入缓冲区可能只需要进行搜索(搜索所需的额外处理与从磁盘读取文件所需的时间相比很小 - 实际上它可能很好在等待数据的时候进行处理。

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

真正的问题在于您是仅搜索每个文件一次还是经常搜索它们。如果只有一次,那么你没有真正的选择,只能扫描文件并花时间。如果您经常这样做,那么您可以考虑以某种方式索引内容。

答案 2 :(得分:0)

考虑使用Hadoop MapReduce。

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