繁体   English   中英

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

[英]Fastest/most optimized way to read/write ASCII file in python

让我更新我的问题,我有一个ascii文件(7G),它有大约100M行。 我使用以下方法阅读此文件

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最好吗?

提前致谢,

将数字数据写入文件的最佳方法是不将其写入ASCII文件。


运行一次以使用np.save将数据存储为二进制(这与pickle ing基本相同):

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

savetxtloadtxt只是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]这样的表达式不会改变内存使用情况,因为xfview - (检查视图与副本的文档)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM