在文本列的大数据文件中读取的最快方法是什么?

2024-05-16 15:34:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个将近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有没有办法加快进度?我很快意识到将数据存储在元组数组中比为每个条目实例化一个类要好。在


Tags: 方法代码intranstime数据文件linefloat
2条回答

在C实现中,您可以尝试将fopen()/fread()/fclose()库函数交换给低级系统调用open()/read()/close()。加速可能来自这样一个事实,即fread()做了大量的缓冲,而{}没有。在

此外,使用更大的块更少地调用read()将减少系统调用的数量,因此用户空间和内核空间之间的切换也将减少。当您发出read()系统调用时(如果它是从fread()库函数调用的)内核所做的是从磁盘读取数据,然后将其复制到用户空间。如果在代码中经常发出系统调用,那么复制部分就变得很昂贵。通过大篇幅阅读,你将得到更少的上下文切换和更少的复制。在

请记住,read()不能保证返回所需字节数的块。这就是为什么在一个可靠且正确的实现中,您总是必须检查read()的返回值。在

一种可能应用到C、C++和Python版本的方法是使用内存映射文件。最显著的好处是,它可以减少数据从一个缓冲区复制到另一个缓冲区时的双重处理量。在许多情况下,由于减少了对I/O的系统调用,因此也有好处

相关问题 更多 >