[英]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 进程/数据副本))
准备数据文件以最适合您对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
第一个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.