20

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

4

3 回答 3

21

如果您的文件没有被索引,则没有直接的方法。

索引它可能是值得的(扫描一次以找到所有行结尾,并存储每行或行块的偏移量)。如果您需要多次处理文件,并且它没有改变,那么索引它的成本可以通过使用索引进行进一步运行来抵消。

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

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

于 2012-04-30T08:47:31.460 回答
10

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

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

  2. 一个愚蠢但有效的技巧:假设您有 N 个进程,您可以通过 argv 或“序列号”告诉每个进程,例如processor -serial_number [1|2|3...N] -num_procs N,它们都可以读取相同的数据,但只处理具有 lineno % num_procs == serial_number. 它的效率有点低,因为它们都会读取整个数据,但同样,如果它们只在每 N 行上工作,而这是大部分时间消耗的,你应该没问题。

于 2012-04-30T09:05:18.700 回答
4

不,没有:除非您不阅读未知数据,否则没人会知道有多少换行符。这个问题的复杂性是 O(n) 因此意味着至少一次你必须阅读整个文件。然后,您可能想要构建一个索引表,在其中记录文件中换行符的位置:这可以被所有进程使用,并且使用 fseek 您可以大大加快进一步的访问速度。

于 2012-04-30T08:47:33.377 回答