Mat*_*Mat 21
如果您的文件没有以其他方式编入索引,则没有直接的方法.
索引它可能是值得的(扫描一次以找到所有行结尾,并存储每行或每行的偏移量).如果您需要多次处理该文件,并且它不会更改,则索引它的成本可能会因为使用索引进行进一步运行而变得容易.
否则,如果您不需要所有作业具有完全相同数量的行/项目,您可以捏造它.
寻找给定的偏移量(比如1G),并寻找最近的行分隔符.在偏移2G等处重复,直到找到足够的断点.
然后,您可以在已识别的每个块上启动并行任务.
Not*_*fer 10
除了此处提到的其他一些选项,不需要扫描整个文件:
创建一个主进程,通过管道/ fifos将行推送到进行实际处理的子进程.这可能有点慢,但是如果说在子进程中花费的时间的90%是实际的文本处理,那应该没问题.
一个愚蠢但有效的技巧:说你有N个进程,你可以通过argv告诉每个进程或者它是"序列号"的东西,例如processor -serial_number [1|2|3...N] -num_procs N,它们都可以读取相同的数据,但只处理具有的数据 lineno % num_procs == serial_number.它的效率会低一些,因为它们都会读取整个数据,但是如果它们只能在每个第N行上运行,这就是大部分时间消耗的,那么你应该没问题.