我有一个非常大的文本文件(超过10GB),想要通过数据挖掘技术读取其中一些信息。为了实现这个目的,我使用MPI并行技术,让多个进程同时访问同一文件。
事实上,我希望每个进程读取N行文本。由于文件没有结构(每个字段包含的字符数不同),我必须解析文件,这不是并行化的,也需要很长时间。
是否有方法可以直接访问特定行而无需解析和计算行数?
谢谢您的帮助。
除了已经提到的需要扫描整个文件的选项外,还有其他一些选择:
创建一个主进程通过管道/命名管道将行推送给实际处理的子进程。这可能会慢一些,但是如果说90%的时间在子进程中用于处理文本,那么应该还是可以的。
一个愚蠢但有效的技巧:假设你有N个进程,可以通过argv或其他方式告诉每个进程它的“序列号”,例如 processor -serial_number [1|2|3...N] -num_procs N
,它们都可以读取相同的数据,但仅处理具有lineno % num_procs == serial_number
的行。它的效率稍低,因为它们将读取全部数据,但是如果它们只处理每第N行,并且这是耗时最长的部分,那么应该没问题。
fseek
是一种完全盲目的寻址方式。它将文件指针移动指定字节数,仅此而已。无论这是否恰好是常数时间取决于文件系统实现细节,但在您的情况下这并不重要 - 寻址将是“瞬间”的。(除非您的文件存储在机械磁带驱动器上...) - Mattell
返回的位置进行合法查找。 - James Kanze