python-将巨大的.dat加载到数组中的最快方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-将巨大的.dat加载到数组中的最快方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1842字,纯文字阅读大概需要3分钟。
内容图文
![python-将巨大的.dat加载到数组中的最快方法](/upload/InfoBanner/zyjiaocheng/661/2f0f3a9b418146ceb8127f5a0a1203af.jpg)
我已经在stackexchange中广泛搜索了一种简洁的解决方案,用于将巨大的(?2GB).dat文件加载到numpy数组中,但是没有找到合适的解决方案.到目前为止,我设法以一种非常快的方式(小于1分钟)将其作为列表加载:
list=[]
f = open('myhugefile0')
for line in f:
list.append(line)
f.close()
使用np.loadtxt会冻结我的计算机,并且需要花费几分钟来加载(?10分钟).如何才能将文件作为数组打开而不会出现似乎困扰np.loadtxt的分配问题?
编辑:
输入数据是一个float(200000,5181)数组.一行示例:
2.27069e-15 2.40985e-15 2.22525e-15 2.1138e-15 1.92038e-15 1.54218e-15 1.30739e-15 1.09205e-15 8.53416e-16 7.71566e-16 7.58353e-16 7.58362e-16 8.81664e -16 1.09204e-15 1.27305e-15 1.58008e-15
等等
谢谢
解决方法:
查看source,看来numpy.loadtxt包含许多代码来处理许多不同的格式.如果您有一个定义良好的输入文件,那么编写针对您的特定文件格式优化的函数并不难.像这样(未经测试):
def load_big_file(fname):
'''only works for well-formed text file of space-separated doubles'''
rows = [] # unknown number of lines, so use list
with open(fname) as f:
for line in f:
line = [float(s) for s in line.split()]
rows.append(np.array(line, dtype = np.double))
return np.vstack(rows) # convert list of vectors to array
如果以前知道行数和列数,则另一种解决方案可能是:
def load_known_size(fname, nrow, ncol)
x = np.empty((nrow, ncol), dtype = np.double)
with open(fname) as f:
for irow, line in enumerate(f):
for icol, s in enumerate(line.split()):
x[irow, icol] = float(s)
return x
这样,您不必分配所有中间列表.
编辑:似乎第二个解决方案要慢一些,列表理解可能比显式的for循环更快.结合这两种解决方案,并使用Numpy进行从字符串到浮点的隐式转换的技巧(才刚刚发现),这可能会更快:
def load_known_size(fname, nrow, ncol)
x = np.empty((nrow, ncol), dtype = np.double)
with open(fname) as f:
for irow, line in enumerate(f):
x[irow, :] = line.split()
return x
为了进一步提高速度,您可能必须使用一些用C或Cython编写的代码.我想知道这些功能需要多少时间才能打开文件.
内容总结
以上是互联网集市为您收集整理的python-将巨大的.dat加载到数组中的最快方法全部内容,希望文章能够帮你解决python-将巨大的.dat加载到数组中的最快方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。