这可以并行化吗?

Sas*_*lla 2 python parallel-processing perl hadoop r

我有一个巨大的制表符分隔文件.(作为行的10,000个受试者和作为列的> 100万个测定).我有一个映射文件,其中包含与100万列中的每一列相关的信息.我需要为每个主题,每个测定,(对于每个单元格)查看映射文件并获取它的一些值并替换现有值.

在Python或Perl中,我必须读取每一行,将其拆分并在映射文件中查找每个单元格.

在R中,我可以一次读取每列,并且所有行都从映射文件中获取信息.

无论哪种方式,循环遍历每一行或每列的整个过程都需要花费大量时间,因为需要完成每个单元查找.

有没有办法可以并行化这个?如果我想并行化并使其更快,我该怎么想?

另外,我有兴趣学习如何在map/reduce风格中解决这个问题?

示例数据文件如下:(制表符分隔)

ID  S1  S2  S3  S4  S5  
1   AA  AB  BA  BB  AB  
2   BA  BB  AB  AA  AA  
3   BA  AB  AB  AB  AB  
4   BA  AB  AB  BB  AA  
5   AA  AB  BA  BB  AB  
6   AA  BB  AB  AA  AA  
Run Code Online (Sandbox Code Playgroud)

映射文件如下:

SID  Al_A  Al_B    
S1    A     C  
S2    G     T  
S3    C     A  
S4    G     T  
S5    A     C  
Run Code Online (Sandbox Code Playgroud)

因此,在数据文件中,在每个单元格中,对于每个A和B,必须在映射文件中进行查找,以查看A映射到的内容(来自Al_A列)以及B映射到的内容(来自Al_B列) .

S.L*_*ott 5

简单的并行性

python parse.py assays.txt | python lookup.py mapping.txt | python reformat.py >result.txt
Run Code Online (Sandbox Code Playgroud)

其中parse.py读取"10,000个主题作为行和> 100万个分析作为列"的"分析"文件它解析并将数据写入stdout.

lookup.py读取"为它获取一些值"映射以填充内部字典.它读取stdin数据,查找并将结果写入stdout.

reformat.py读取stdin并重新格式化它以写入最终报告,该报告似乎镜像输入结构.

虽然这不是"令人尴尬地"并行,但它确实将工作分解为一些平行的并行步骤.它非常强大,可以节省一些时间


然而,你可能想要的是反映问题令人尴尬的并行性质的东西.有10,000*1,000,000 == 100亿个人值,所有这些值似乎完全独立.

另一种(更复杂的)方法就是这样.这取决于http://docs.python.org/library/multiprocessing.html.

  1. 一个简单的阅读器Process对输入文件进行分区,将记录写入n个不同的Queues.这意味着每个记录Queue获得10,000/n个记录. n可以是10到100之间的大数.是的.100个队列,每个队列获得100条记录.如果他们等待安排在您服务器上的微小核心上,那也没关系.核心将100%忙碌.这是好事.

  2. 每个n Queue都由一个工作人员提供服务,该工作人员Process对记录中的每个测定进行查找,并将得到的记录放入输出中Queue.您可以调整n到各种值,看看会发生什么.在某些时候,更多的工人会减慢速度.很难预测那个水平在哪里,所以试验.

  3. 输出Queue由工作人员读取,工作人员Process只是根据它在队列中找到的内容格式化输出文件.

这意味着您需要某种"Assay"对象,您可以从输入文件序列化并入队到Python