在Python中读/写ASCII文件的最快/最优化的方式
让我更新我的问题,我有一个ASCII文件(7G),它有大约100M行。我读这个文件使用:在Python中读/写ASCII文件的最快/最优化的方式
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
最好?
由于事先
为数字数据写入到文件最优化的方式,是不是写的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))
谢谢。保存数据npy binary会将下次加载时间从80(min)减少到2(s)。 – Heli
savetxt
和loadtxt
只需逐行写入和读取文件即可。保存基本上是:
with open(...) as f:
for row in arr:
f.write(fmt % tuple(row))
其中fmt
先后为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
是f
的view
- (在视图上检查文档与副本)。
这些numpy函数适用于适度大小的文件,但越来越多的人将这些代码用于大型数据集 - 文本或数据挖掘。
你正在阅读文本文件,但它被转换为数字二进制数据:二进制文件重量小于文本。您应该考虑将文件存储为二进制文件,使用scipy或自定义格式(也许pickle会这样做)。你会节省时间。 –
_“为什么它不会将内存使用量增加7.4 GB”_ - - 因为字符串“1。2345667892323“在内存中占用的空间比双'所需的8个字节多 – Eric
请参阅http://*.com/questions/15096269/the-fastest-way-to-read-input-in-python –