我有一个将近900万行的数据文件(很快就会超过5亿行),我正在寻找最快的方法来读入它。五个对齐的列被填充并用空格隔开,因此我知道在每一行的哪里可以找到我想要的两个字段。 我的Python例程需要45秒:
import sys,time
start = time.time()
filename = 'test.txt' # space-delimited, aligned columns
trans=[]
numax=0
for line in open(linefile,'r'):
nu=float(line[-23:-11]); S=float(line[-10:-1])
if nu>numax: numax=nu
trans.append((nu,S))
end=time.time()
print len(trans),'transitions read in %.1f secs' % (end-start)
print 'numax =',numax
而我在C中提出的例行程序是更令人愉快的4秒:
^{pr2}$ Fortran、C++和java的解决方案采取中间时间(27秒,20秒,8秒)。 我的问题是:我在上面的代码(尤其是C-代码)中犯了什么大错吗?Python有没有办法加快进度?我很快意识到将数据存储在元组数组中比为每个条目实例化一个类要好。在
在C实现中,您可以尝试将}没有。在
fopen()
/fread()
/fclose()
库函数交换给低级系统调用open()
/read()
/close()
。加速可能来自这样一个事实,即fread()
做了大量的缓冲,而{此外,使用更大的块更少地调用
read()
将减少系统调用的数量,因此用户空间和内核空间之间的切换也将减少。当您发出read()
系统调用时(如果它是从fread()
库函数调用的)内核所做的是从磁盘读取数据,然后将其复制到用户空间。如果在代码中经常发出系统调用,那么复制部分就变得很昂贵。通过大篇幅阅读,你将得到更少的上下文切换和更少的复制。在请记住,
read()
不能保证返回所需字节数的块。这就是为什么在一个可靠且正确的实现中,您总是必须检查read()
的返回值。在一种可能应用到C、C++和Python版本的方法是使用内存映射文件。最显著的好处是,它可以减少数据从一个缓冲区复制到另一个缓冲区时的双重处理量。在许多情况下,由于减少了对I/O的系统调用,因此也有好处
相关问题 更多 >
编程相关推荐