我需要使用numpy排序一个非常大的基因组数据集.我有一个26亿个浮标数组,维数=(868940742,3),在我的机器上占用大约20GB的内存,只是坐在那里.我有一个早期的2015 13’MacBook Pro与16GB内存,500GB固态高清和3.1 GHz英特尔i7处理器.只是加载数组溢出到虚拟内存,但不是我的机器受损的程度,或者我不得不停止我所做的一切.

我从22个较小的(N,2)子阵列中逐步构建这个非常大的阵列.

函数FUN_1使用我称之为sub_arr的22个子阵列中的每一个生成2个新的(N,1)数组.

FUN_1的第一个输出是通过对数组b = array([X,F(X)])上的sub_arr [:,0]的值进行内插生成的,第二个输出是通过将sub_arr [:, 0]放入使用数组的bin中生成的r =数组([X,BIN(X)]).我分别称这些输出为b_arr和rate_arr.该函数返回一个3元组的(N,1)数组:

import numpy as np
def FUN_1(sub_arr):
"""interpolate b values and rates based on position in sub_arr"""
b = np.load(bfile)
r = np.load(rfile)
b_arr = np.interp(sub_arr[:,0], b[:,0], b[:,1])
rate_arr = np.searchsorted(r[:,0], sub_arr[:,0]) # HUGE efficiency gain over np.digitize...
return r[rate_r, 1], b_arr, sub_arr[:,1]

我在一个for循环中调用函数22次,并填充预先分配的零数组full_arr = numpy.zeros([868940742,3]),值为:

full_arr[:,0], full_arr[:,1], full_arr[:,2] = FUN_1

在这一步节省记忆方面,我认为这是我能做的最好的,但我可以接受建议.无论哪种方式,我都不会遇到这个问题,只需要2分钟.

这是排序例程(有两个连续的排序)

for idx in range(2):
sort_idx = numpy.argsort(full_arr[:,idx])
full_arr = full_arr[sort_idx]
# ...
#

现在这样一直工作,虽然缓慢(约10分钟).然而,我最近开始使用FUN_1中上述插值步骤的[X,F(X)]值更大,更精细的分辨率表,返回b_arr,现在SORT真的放慢速度,尽管其他一切都保持不变.

有趣的是,我甚至不排除在排序现在滞后的步骤中的内插值.以下是不同内插文件的一些片段 – 每种情况下,较小的插值文件大约减小约30%,而在第二列中的值更为均匀;较慢的分辨率和更多的唯一值,所以插值的结果可能更独特,但我不知道这是否应该有任何影响?

较大,较慢的文件:

17399307 99.4
17493652 98.8
17570460 98.2
17575180 97.6
17577127 97
17578255 96.4
17580576 95.8
17583028 95.2
17583699 94.6
17584172 94

更小,更统一的常规文件:

1 24
1001 24
2001 24
3001 24
4001 24
5001 24
6001 24
7001 24

我不知道可能导致这个问题,我会感兴趣的任何建议或只是一般的输入关于排序在这种类型的内存限制的情况下!