如何在非常大的文本文件上直接有效地访问?

ezz*_*rem 20 c c++ file-io mpi

我有一个非常大的文本文件(+ 10GB),我想阅读一些数据挖掘技术.为此,我使用MPI并行技术,因此许多进程可以一起访问同一个文件.
实际上,我希望每个进程读取N行数.由于文件没有结构化(相同数量的字段,但每个字段可以包含不同数量的字符),我有义务解析文件,这是不平行的,需要花费很多时间.有没有办法直接访问特定数量的行,并且需要解析和计算行数?谢谢你的帮助.

Mat*_*Mat 21

如果您的文件没有以其他方式编入索引,则没有直接的方法.

索引它可能是值得的(扫描一次以找到所有行结尾,并存储每行或每行的偏移量).如果您需要多次处理该文件,并且它不会更改,则索引它的成本可能会因为使用索引进行进一步运行而变得容易.

否则,如果您不需要所有作业具有完全相同数量的行/项目,您可以捏造它.
寻找给定的偏移量(比如1G),并寻找最近的行分隔符.在偏移2G等处重复,直到找到足够的断点.

然后,您可以在已识别的每个块上启动并行任务.

  • 请注意,如果解决方案涉及随机搜索,则必须以二进制模式打开文件(并使用行终止符的平台相关定义).如果文件在文本模式下打开,那么唯一合法的搜索是前面,结尾或者`tell`返回的位置. (2认同)

Not*_*fer 10

除了此处提到的其他一些选项,不需要扫描整个文件:

  1. 创建一个主进程,通过管道/ fifos将行推送到进行实际处理的子进程.这可能有点慢,但是如果说在子进程中花费的时间的90%是实际的文本处理,那应该没问题.

  2. 一个愚蠢但有效的技巧:说你有N个进程,你可以通过argv告诉每个进程或者它是"序列号"的东西,例如processor -serial_number [1|2|3...N] -num_procs N,它们都可以读取相同的数据,但只处理具有的数据 lineno % num_procs == serial_number.它的效率会低一些,因为它们都会读取整个数据,但是如果它们只能在每个第N行上运行,这就是大部分时间消耗的,那么你应该没问题.