在python中读/写ASCII文件的最快/最优化的方法

时间:2016-11-29 14:23:00

标签: python numpy io ascii

让我更新我的问题,我有一个大约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.loadtxtnp.savetxt是最好的?

先谢谢,

2 个答案:

答案 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)

savetxtloadtxt只是逐行编写和读取文件。保存本质上是:

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函数适用于适度大小的文件,但越来越多的人将此代码用于大型数据集 - 文本或数据挖掘。