有效地处理python中的大型.text文件

时间:2012-11-15 16:12:47

标签: python tabs window sliding delimited

我对python和编程很新,但是我试图在一个包含大约700万行python的制表符分隔的.txt文件上运行“滑动窗口”计算。我的意思是滑动窗口是它将运行计算超过50,000线,报告数字然后向上移动说10,000行并对另外50,000行执行相同的计算。我有计算和“滑动窗口”正常工作,如果我在我的数据的一小部分测试它运行良好。但是,如果我尝试在我的整个数据集上运行该程序,那就非常慢(我现在已经运行了大约40个小时)。数学很简单,所以我认为不应该花这么长时间。

我现在正在阅读我的.txt文件的方法是使用csv.DictReader模块。我的代码如下:

file1='/Users/Shared/SmallSetbee.txt'
newfile=open(file1, 'rb')
reader=csv.DictReader((line.replace('\0','') for line in newfile), delimiter="\t")

我相信这是在同一时间内制作了一百多万行的字典,我认为这可能是因为它对于较大的文件来说减慢了很多。

由于我只对一次运行数据的“块”或“窗口”计算感兴趣,是否有更有效的方法一次只读取指定的行,执行计算然后重复指定行的新指定“块”或“窗口”?

2 个答案:

答案 0 :(得分:6)

collections.deque是可以采用最大尺寸的有序项目集合。当您将项目添加到一端时,另一端会下降。这意味着要迭代你的csv上的“窗口”,你只需要继续向deque添加行,它就会处理丢掉完整的行。

dq = collections.deque(maxlen=50000)
with open(...) as csv_file:
    reader = csv.DictReader((line.replace("\0", "") for line in csv_file), delimiter="\t")

    # initial fill
    for _ in range(50000):
        dq.append(reader.next())

    # repeated compute
    try:
        while 1:
            compute(dq)
            for _ in range(10000):
                dq.append(reader.next())
    except StopIteration:
            compute(dq)

答案 1 :(得分:3)

请勿使用csv.DictReader,而是使用csv.reader。为每行创建字典所需的时间比为每行创建列表所需的时间长。此外,通过索引访问列表比通过密钥访问字典要快一些。

我使用两个csv阅读器对300,000行4列csv文件进行迭代计时。 csv.DictReadercsv.reader 七倍

将此与katrielalex's suggestion结合使用collections.deque,您应该会看到一个不错的加速。

此外,profile您的代码可以确定您花费大部分时间的地方。