我有一个脚本,生成二维numpy arrays dtype=float和形状的顺序(1e3, 1e6).现在我正在使用np.save并使用np.load数组执行IO操作.但是,每个阵列的这些功能需要几秒钟.是否有更快的方法来保存和加载整个数组(即,不对其内容进行假设并减少它们)?array只要数据保留完全,我就可以在保存之前将s 转换为另一种类型.
我试图计算100,000个向量的余弦相似度,并且这些向量中的每一个都有200,000个维度.
从阅读其他问题我知道memmap,PyTables和h5py是我处理这类数据的最佳选择,我目前正在使用两个memmaps; 一个用于读取矢量,另一个用于存储余弦相似性矩阵.
这是我的代码:
import numpy as np
import scipy.spatial.distance as dist
xdim = 200000
ydim = 100000
wmat = np.memmap('inputfile', dtype = 'd', mode = 'r', shape = (xdim,ydim))
dmat = np.memmap('outputfile', dtype = 'd', mode = 'readwrite', shape = (ydim,ydim))
for i in np.arange(ydim)):
for j in np.arange(i+1,ydim):
dmat[i,j] = dist.cosine(wmat[:,i],wmat[:,j])
dmat.flush()
Run Code Online (Sandbox Code Playgroud)
目前,htop报告说我正在使用224G的VIRT内存,而91.2G的RES内存正在稳步攀升.在我看来,在整个过程结束时,整个输出矩阵将存储在内存中,这是我试图避免的.
问:这是memmaps的正确用法,我在记忆有效的方式写入到输出文件(我的意思是,只有输入和输出文件的必要部分,即dmat[i,j]和wmat[:,i/j],存储在内存中)?
如果没有,我做错了什么,我该如何解决这个问题呢?
感谢您的任何建议!
编辑:我刚刚意识到htop报告的总体系统内存使用量为12G,所以它似乎正在起作用......那里有谁可以开导我?RES现在是111G ......
编辑2:memmap是从一维数组创建的,该数组由很多很长的小数组成,非常接近于0,形状符合所需的尺寸.然后memmap看起来像这样.
memmap([[ 9.83721223e-03, 4.42584107e-02, 9.85033578e-03, ...,
-2.30691545e-07, -1.65070799e-07, 5.99395837e-08],
[ 2.96711345e-04, -3.84307391e-04, 4.92968462e-07, ..., …Run Code Online (Sandbox Code Playgroud) 目前,我正在使用h5py生成hdf5数据集.我有类似的东西
import h5py
import numpy as np
my_data=np.genfromtxt("/tmp/data.csv",delimiter=",",dtype=None,names=True)
myFile="/tmp/f.hdf"
with h5py.File(myFile,"a") as f:
dset = f.create_dataset('%s/%s'%(vendor,dataSet),data=my_data,compression="gzip",compression_opts=9)
Run Code Online (Sandbox Code Playgroud)
这适用于相对较大的ASCII文件(400MB).我想对更大的数据集(40GB)做同样的事情.使用h5py有更好或更有效的方法吗?我想避免将整个数据集加载到内存中.
有关数据的一些信息:
dtype=None从np.loadtxt()我正在使用大数据,并且我有大小像2000x100000的矩阵,所以为了更快地工作,我尝试使用numpy.memmap避免由于RAM限制而在内存中存储这个大矩阵.问题是,当我将相同的矩阵存储在2个变量中时,即一个用numpy.load,另一个用np.memmap,内容不一样.这是正常的吗?我在memmap中使用与我的数据中相同的数据类型.例:
A1 = numpy.load('mydata.npy')
A2 = numpy.memmap('mydata.npy',dtype=numpy.float64, mode='r', shape=(2000,2000))
A1[0,0] = 0
A2[0,0] = 1.8758506894003703e-309
Run Code Online (Sandbox Code Playgroud)
这是两种情况下数组第一个元素的内容.正确的一个是值0但我通过使用memmap得到这个奇怪的数字.谢谢.
我有一个案例,我想使用mmap模式打开一个压缩的numpy文件,但似乎无法找到任何有关它如何在幕后工作的文档.例如,它会解压缩内存中的存档然后mmap吗?它会在飞行中解压缩吗?
该配置缺少该文档.