Python多处理是否适合比较两个非常大的gzip文件?

时间:2015-11-30 10:14:44

标签: python python-2.7 multiprocessing large-data

我很抱歉发布了很多背景资料来说明我的问题,但是这里说:我在python 2.7中创建了一个脚本来比较两个大文件并输出任何差异。该脚本目前需要大约19个小时才能完成,我希望通过多核处理来减少这种情况。

文件的结构如下:

r1 count:3 contained:True   -   rs692242298 40  ACGCTTTCCGGCCG  IIIIIIIIIIIIII  2   
r1 count:3 contained:True   -   rs344292768 73  ACGCTTTCCGGCCG  IIIIIIIIIIIIII  2   
r1 count:3 contained:True   -   rs326313795 23  ACGCTTTCCGGCCG  IIIIIIIIIIIIII  2   
r10 count:592 contained:True    +   rs690696575 4   CGGCCGGAAAGCGC  IIIIIIIIIIIIII  3   
r10 count:592 contained:True    +   rs333942854 30  CGGCCGGAAAGCGC  IIIIIIIIIIIIII  3   
r10 count:592 contained:True    +   rs323000429 65  CGGCCGGAAAGCGC  IIIIIIIIIIIIII  3   
r10 count:592 contained:True    +   rs341309868 76  CGGCCGGAAAGCGC  IIIIIIIIIIIIII  3   
r11 count:1 contained:False +   rs346130515 43  CTCCGTCCGGCG    IIIIIIIIIIII    10  
r11 count:1 contained:False +   rs336124149 75  CTCCGTCCGGCG    IIIIIIIIIIII    10

......当我说它们很大时,我的意思是非常大。每个文件(gzip)占用大约30 GB,如果解压缩3 TB(所以我从不解压!!)。对于任何感兴趣的人,这是一个名为bowtie的基因组比对程序的输出。比较是逐行的。大多数行在另一个文件中将具有完全匹配,但我需要查找并输出唯一的行(在其他文件中不匹配 - 两种方式)。

文件的结构使得具有相同id的所有行(最左边的r#)组合在一起。 id数(示例中的r1,r10,r11)正在增长,但由于bowtie中的多核处理,模式不稳定(因此r1和r10之间的间隙)。这也意味着文件的特定id的行块的相对位置不同。特定id的行数通常为数百万。

我使用生成器迭代地返回id的所有行的列表。只要我有两个相似的ID(每个文件一个),我通过将列表添加到冻结集来比较该ID的列表,然后使用差异方法获得唯一的行:

lines_file1 = frozenset(file_1_lines)
lines_file2 = frozenset(file_2_lines)
unique_lines = list(lines_file1.difference(lines_file2)) + list(lines_file2.difference(lines_file1))

然后我写了唯一的行来输出并删除原始列表以节省内存。

在对活动进行计时时,大部分时间花费在"阅读"文件(约10小时)。由于这主要受CPU限制(由于压缩),我认为通过将其分成两个进程,我可以将其减半。如果我可以将其他任务并行化,我可能会将总时间从19小时减少到5小时。 使用"潜在的"这里反映出我可能无法完全理解Python多处理的优点和缺点,以及我希望实现的目标是否可行。

从我迄今为止所做的尝试来看,最大的障碍之一(如果我已经正确理解了这一点)就是需要对所有东西进行腌制,这对于如此大量的数据来说是不可行的。如果这是正确的,我会说Python多处理用于分析遗传数据的可用性几乎没有。

因此,制定一个具体的问题:是否有可能(可能通过某种映射来避免腌制所有东西)来创建一个生产者进程,它同时读取两个输入文件并输出每个元组的2元组包含一个id的两个行列表?

我是否可以让消费者访问这些元组的列表/队列来比较每一对,并将唯一的行输出到SAME输出文件?

如果上述答案是肯定的,也许,如果你能指出我正确的方向,我将不胜感激。我必须承认,现在我对多处理" power"对于像这样的东西来说,它是无用的,而且我的时间更好地花在其他地方。但我有点希望这只是因为我自己的无知。谢谢。

0 个答案:

没有答案