Python 对于较大的文件,np.load()异常缓慢
因此,我正在使用np.load()加载一些大小在150MB到250MB之间的文件。每个文件包含一个数组,该数组有5个子数组和一些数据。一些文件在一秒钟内加载,而另一些则需要5秒钟才能加载,因为我有很多这样的文件,它们都需要相当长的时间来处理,因为加载速度很慢。但是,我注意到,如果我将文件拆分为5个较小的文件(每个文件一个子数组),那么加载时间总是很容易低于每5个文件一秒钟Python 对于较大的文件,np.load()异常缓慢,python,numpy,Python,Numpy,因此,我正在使用np.load()加载一些大小在150MB到250MB之间的文件。每个文件包含一个数组,该数组有5个子数组和一些数据。一些文件在一秒钟内加载,而另一些则需要5秒钟才能加载,因为我有很多这样的文件,它们都需要相当长的时间来处理,因为加载速度很慢。但是,我注意到,如果我将文件拆分为5个较小的文件(每个文件一个子数组),那么加载时间总是很容易低于每5个文件一秒钟 这可能是什么原因造成的?如何在不将每个文件拆分为较小文件的情况下加速np.load()?问题的根源在于numpy中实际上没有
这可能是什么原因造成的?如何在不将每个文件拆分为较小文件的情况下加速np.load()?问题的根源在于numpy中实际上没有子数组的概念 考虑这个例子:
import numpy as np
a1 = np.ones(2**17)
a2 = np.arange(2**18)
a3 = np.random.randn(2**19)
a = np.array([a1, a2, a3])
print(a.dtype) # object
如果将数组放入数组中,numpy不知道它们是数组。相反,它将它们视为通用Python对象。这就是政府必须说的:
允许泡菜:bool,可选
允许使用Python pickle保存对象数组。[…]默认值:True
因此,子数组是由pickler处理的,这是非常低效的。显然,单独保存阵列时不会发生这种情况。现在它们被高效地存储为numpy数组。不幸的是,您不能简单地设置allow\u pickle=False
,因为这样就不允许存储对象数组
解决方案是用于存储多个阵列。以下是与上述阵列的定时比较:
np.save('test.npy', a)
%timeit np.load('test.npy') # 10 loops, best of 3: 40.4 ms per loop
np.savez('test2.npz', a1, a2, a3)
%timeit np.load('test2.npz') # 1000 loops, best of 3: 339 µs per loop
您可以使用
x = np.load('test2.npz')
a1 = x['arr_0']
a2 = x['arr_1']
# ...
最好将数组作为关键字参数传递给savez
,这样就可以为它们命名:
np.savez('test3.npz', a1=a1, a2=a2, timmy=a3)
x = np.load('test3.npz')
a1 = x['a1']
a2 = x['a2']
a3 = x['timmy']
您如何测量运行时间?也许拆分文件可以使其适应于中,这使得加载速度更快?我只是粗略地计算了一下,但是在拆分文件之后加载所有文件大约需要一分钟,而在拆分文件之前则需要将近10分钟。我怀疑这仅仅是页面缓存。文件的格式是什么?您如何调用
np.load
?(只是猜测-委托给,可能会在分支中结束。)很抱歉之前没有回答您的问题,我认为该格式只是一个pickle文件格式,它们是用np.save(file)
保存的,用np.load(file)加载的
,无其他参数@kazemakaseSo,若你们要保存一个多维矩阵,比如一个形状的矩阵(1024102410241024),那个么通过numpy是否不可能有效地保存呢?(我可能可以将其展平,保存,然后加载并将其切片到适当的维度,但有没有更优雅的方法呢?)多维数组没有问题。您只需使用np.save
保存即可。请注意,[arr1,arr2,arr3,arr4,arr5]
不是一个多维数组-它是一个数组列表,如您所观察到的,它可能会导致性能问题