让我更新我的问题,我有一个大约100M行的ascii文件(7G)。我使用以下方式阅读此文件:
f=np.loadtxt(os.path.join(dir,myfile),delimiter=None,skiprows=0)
x=f[:,1]
y=f[:,2]
z=f[:,3]
id=f[:,0]
稍后我将需要x,y,z和id数组进行插值。问题是读取文件需要大约80分钟,而插值只需要15分钟。
我尝试使用python memory_profiler模块获取脚本每行使用的内存增量。
以下读取整个7.4 GB文件的行将内存使用量增加3206.898 MiB(3.36 GB)。第一个问题是为什么它不会增加7.4 GB的内存使用量?
f=np.loadtxt(os.path.join(dir,myfile),delimiter=None,skiprows=0)
以下4行根本不会增加内存。
x=f[:,1]
y=f[:,2]
z=f[:,3]
id=f[:,0]
最后,如果您能推荐我在python中读取/写入文件的最佳方法,我仍然会很感激。 numpy np.loadtxt
和np.savetxt
是最好的?
先谢谢,
答案 0 :(得分:2)
将数字数据写入文件的最佳方法是不将其写入ASCII文件。
运行一次以使用np.save
将数据存储为二进制文件(基本上与pickle
相同):
np_file = os.path.splitext(myfile)[0] + '.npy'
data = np.loadtxt(os.path.join(dir,myfile),delimiter=None,skiprows=0)
np.save(os.path.join(dir, np_file), data)
然后你可以在下次加载它:
data = np.load(os.path.join(dir, np_file))
答案 1 :(得分:1)
savetxt
和loadtxt
只是逐行编写和读取文件。保存本质上是:
with open(...) as f:
for row in arr:
f.write(fmt % tuple(row))
其中fmt
的{{1}}每列都有%
格式。
加载基本上是
arr
它在列表列表中收集文本文件的所有值,并在最后将其转换为数组一次。
像alist = []
for row in f: # ie f.readline()
line = row.split(delimiter)
<convert types>
alist.append(line)
np.array(alist)
这样的表达式不会更改内存使用量,因为x=f[:,0]
是x
的{{1}} - (查看视图与副本的文档)。
这些numpy函数适用于适度大小的文件,但越来越多的人将此代码用于大型数据集 - 文本或数据挖掘。