我有我想读一些数据挖掘工艺非常大的文本文件(+ 10GB)。 要做到这一点,我用MPI并行工艺如此多的进程可以一起访问同一个文件。
事实上,我想,每个处理中读取的行的N个。 由于该文件未结构化的(相同的字段数,但每个字段可以包含不同数量的字符),我在来解析文件的义务和不平行,它需要大量的时间。 有什么办法可以直接访问线withount解析和计数线的具体数量? 谢谢你的帮助。
Answer 1:
如果你的文件没有索引,否则,就没有直接的方法。
索引它可能是值得的(扫描一次找到所有的行结尾,并存储每一行或行块的偏移量)。 如果您需要将文件多次的过程,它不会改变,索引它的成本可以通过易于使用的进一步运行的指数所抵消。
否则,如果你并不需要所有的职位有相同数量的行/项,你可以只掰过来。
寻求一个给定的偏移(说1G),寻找最接近的行分隔符。 重复在抵消2G,等等,直到你找到足够的破发点。
然后,您可以火了每个你已经确定了块的并行任务。
Answer 2:
其他几个选项超出了已经提及的是不需要扫描整个文件:
使一个主进程是推动通过管道/ FIFO的到执行实际处理的子进程线。 这可能是有点慢,但如果说90%的子过程所花费的时间是文本的实际捣鼓,就应该没问题。
愚蠢的,但有效的一招:说你有N个过程,你可以告诉通过的argv或东西每个进程,它的“序列号”,例如
processor -serial_number [1|2|3...N] -num_procs N
,他们都可以读相同的数据,但只处理有行lineno % num_procs == serial_number
。 这是一个有点低效率的,因为他们都将读取整个数据,但同样,如果他们只在每个第n行的工作,那就是消耗大部分的时间,你应该罚款。
Answer 3:
没有没有:直到你不通过你的未知数据没人看就会知道有多少新行字符有。 这个问题的复杂度为O(N),从而意味着至少一次 ,你必须阅读整个文件。 这时,你可能想建立,您记录下有你的文件中的新行字符的索引表:这可以通过所有的过程中使用,并与FSEEK可以加快急剧进一步访问。
文章来源: How to access directly and efficiently on very large text file?