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

flz*_*416 6 python tabs window delimited sliding

我对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")
Run Code Online (Sandbox Code Playgroud)

我相信这是一次性地从所有700万行中生成一本字典,我认为这可能是因为它对于较大的文件而言减慢了很多.

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

Kat*_*iel 6

A 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)
Run Code Online (Sandbox Code Playgroud)