在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.loadtxtnp.savetxt最好?

由于事先

+2

你正在阅读文本文件,但它被转换为数字二进制数据:二进制文件重量小于文本。您应该考虑将文件存储为二进制文件,使用scipy或自定义格式(也许pickle会这样做)。你会节省时间。 –

+1

_“为什么它不会将内存使用量增加7.4 GB”_ - - 因为字符串“1。2345667892323“在内存中占用的空间比双'所需的8个字节多 – Eric

+0

请参阅http://*.com/questions/15096269/the-fastest-way-to-read-input-in-python –

为数字数据写入到文件最优化的方式,是不是写的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)) 
+0

谢谢。保存数据npy binary会将下次加载时间从80(min)减少到2(s)。 – Heli

savetxtloadtxt只需逐行写入和读取文件即可。保存基本上是:

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]等的表达不改变存储器使用,因为xfview - (在视图上检查文档与副本)。

这些numpy函数适用于适度大小的文件,但越来越多的人将这些代码用于大型数据集 - 文本或数据挖掘。