繁体   English   中英

Python:百万条记录的缓慢处理

[英]Python: slow processing of million records

我想处理一个数据(包含在稍后加载到numpy.array实例的磁盘文件中),其行如下:

1 3 a
1 4 b
1 5 a
2 6 b

其中第一列是开始时间,第二列是结束时间,第三列是 id。 我想处理这些数据,以便在每个开始时间识别多个 id,例如:

1  2
2  2
3  2
4  2
5  2
6  1

其中第一列是开始时间,第二列是 id 数

我编写了以下代码来处理它:

j=[]                                          # a list of ids
for i in range( len( dataset1 ) ):
    indices = numpy.argwhere( ( dataset1[i,0] >= dataset[:,0] )
                            & ( dataset1[i,0] <= dataset[:,1] )
                              )
    j.append( len( set( dataset[indices[:,0],2] ) ) )

在哪里:
- dataset1第一列是 1,2,3,4,5,6 时间戳,并且
- dataset有三列:开始时间、结束时间和 id。

我必须处理dataset1给出的大约 9 亿行。 这是非常缓慢的。

我试图将其并行化为:

inputs = range( len( dataset1 ) )

def processInput( b ):
    indices = numpy.argwhere( ( b >= dataset[:,0] )
                            & ( b <= dataset[:,1] )
                              )
    return( len( set( dataset[indices[:,0],2] ) ) )

num_cores = 10

results = Parallel( n_jobs = num_cores )( delayed( processInput )( dataset[j,0] ) for j in inputs )

但这仍然很慢。 我还有 10 个可用内核,但随后磁盘成为瓶颈。

有没有办法快速处理这些数据?

有什么办法可以快速处理这些数据?

就在这里。

(由于 GIL 锁定,Python线程在这里没有一点帮助(在纯[SERIAL]顺序处理中重新序列化所有工作,增加额外开销以增加对 GIL 锁定获取的搜寻强度),基于 Python进程的并行性很昂贵,并且复制所有 RAM 数据,包括 itnerpreter 多次询问(磁盘块,因为它交换 RAM,不是因为顺利读取通道,而是因为文件中的一些< 1E9数据行,当然,除非您有多个[TB] RAM 设备来一次保存所有 python 进程/数据副本))


第1步:
将有效的数据流设置为足够有效的处理

准备数据文件以最适合您对id -s 的进一步琐碎计数

sort -k1,1       \
     -k3          \
     --parallel=19 \
     --output=dataset1_SORTED_DATA.txt < dataset1_data_file.txt

sort --parallel=19 \
     --output=dataset_SORTED_GATEs.txt < dataset_T1_T2_GATEs_data_file.txt

第2步:
按照从第二个文件中读取的“门控”顺序处理排序文件

第一个dataset1_SORTED_DATA.txt文件接下来简单地处理(计算符合条件的连续、连续的行块),按照使用在第二个dataset_SORTED_GATEs.txt准备的同样排序的< T1_start, T2_end > -gates 指示的顺序读取它一次dataset_SORTED_GATEs.txt文件。

这几乎是一个流处理,是平滑的,并且只使用简单的行计数,满足...SORTED_GATEs.txt数据文件中的两个条件,其中< T1, T2 > -gates,再次单调地变得越来越大,所以第一个...SORTED_DATA.txt文件在一个平滑的传递中得到处理,只计算id -s,按照要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM