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列) .
简单的并行性
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.
一个简单的阅读器Process对输入文件进行分区,将记录写入n个不同的Queues.这意味着每个记录Queue获得10,000/n个记录. n可以是10到100之间的大数.是的.100个队列,每个队列获得100条记录.如果他们等待安排在您服务器上的微小核心上,那也没关系.核心将100%忙碌.这是好事.
每个n Queue都由一个工作人员提供服务,该工作人员Process对记录中的每个测定进行查找,并将得到的记录放入输出中Queue.您可以调整n到各种值,看看会发生什么.在某些时候,更多的工人会减慢速度.很难预测那个水平在哪里,所以试验.
输出Queue由工作人员读取,工作人员Process只是根据它在队列中找到的内容格式化输出文件.
这意味着您需要某种"Assay"对象,您可以从输入文件序列化并入队到Python