Python 对于较大的文件,np.load()异常缓慢

Python 对于较大的文件,np.load()异常缓慢,python,numpy,Python,Numpy,因此,我正在使用np.load()加载一些大小在150MB到250MB之间的文件。每个文件包含一个数组,该数组有5个子数组和一些数据。一些文件在一秒钟内加载,而另一些则需要5秒钟才能加载,因为我有很多这样的文件,它们都需要相当长的时间来处理,因为加载速度很慢。但是,我注意到,如果我将文件拆分为5个较小的文件(每个文件一个子数组),那么加载时间总是很容易低于每5个文件一秒钟 这可能是什么原因造成的?如何在不将每个文件拆分为较小文件的情况下加速np.load()?问题的根源在于numpy中实际上没有

因此,我正在使用np.load()加载一些大小在150MB到250MB之间的文件。每个文件包含一个数组,该数组有5个子数组和一些数据。一些文件在一秒钟内加载,而另一些则需要5秒钟才能加载,因为我有很多这样的文件,它们都需要相当长的时间来处理,因为加载速度很慢。但是,我注意到,如果我将文件拆分为5个较小的文件(每个文件一个子数组),那么加载时间总是很容易低于每5个文件一秒钟


这可能是什么原因造成的?如何在不将每个文件拆分为较小文件的情况下加速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]
不是一个多维数组-它是一个数组列表,如您所观察到的,它可能会导致性能问题