高效地处理Python中的大.txt文件(Processing a large .txt file

2019-07-03 21:05发布

我一般很新的蟒蛇和编程,但我想运行在包含与蟒蛇约7万行制表符分隔的.txt文件“滑动窗口”的计算。 我的意思滑动窗口是,它会运行一个计算过说50,000行,报告的数量,然后向上移动说10000行,并在另一个50,000行执行相同的计算。 我的计算和“滑动窗口”正常工作,它如果我测试它在我的数据的AA小部分运行良好。 但是,如果我尝试在我的整个数据运行的程序设置是非常慢(我已经受够了,现在运行约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")

我认为,这是制作出来的字典全部7个万行的一次,我在想可能是它会减慢这么多的大文件的原因。

因为我只在“块”或一次数据的“窗口”运行我的计算有兴趣,有没有读一次只指定线路,进行计算,然后用指定了新的重复“更有效的方法块”或‘指定行之窗’?

Answer 1:

一个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)


Answer 2:

不要使用csv.DictReader ,改用csv.reader 。 它需要更长的时间来创建一个字典的每一行比需要为每个行的清单。 此外,它是稍快通过索引来访问列表比它通过一键访问字典。

我计时遍历所有使用两个CSV读者30万行4列的csv文件。 csv.DictReader比花长7倍 csv.reader

与此相结合katrielalex的建议使用collections.deque ,你会看到一个不错的加速比。

此外, 配置文件代码以查明你在哪里花你的大部分时间。



文章来源: Processing a large .txt file in python efficiently