在 python 中有效地处理一个大的 .txt 文件

Posted

技术标签:

【中文标题】在 python 中有效地处理一个大的 .txt 文件【英文标题】:Processing a large .txt file in python efficiently 【发布时间】:2012-11-04 07:02:53 【问题描述】:

我对 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")

我相信这是一次从所有 700 万行中制作一本字典,我认为这可能是它对于较大文件的速度如此之慢的原因。

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

【问题讨论】:

这不会一次创建所有行的字典。它为每一行制作一个字典。这意味着您发布的 sn-p 不是您性能问题的原因。也许您可以向我们展示更多代码? 我怀疑如果您正在对大量类似表格的数据进行计算,您可能希望查看 Pandas:pandas.pydata.org/pandas-docs/dev/… 您尝试做的所有事情都可能在 1000 年之前已经完成好几倍。 您将在 696 个“窗口”上运行此计算。 50k 行文件的单个窗口需要多长时间? 分析您的代码并准确了解它大部分时间都花在了哪里。 sliding_window(iterable, size, step, fillvalue) 【参考方案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)

【讨论】:

try/except 应该更接近于reader.next() 以避免从compute(dq) 意外捕获StopIteration【参考方案2】:

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

我使用两个 csv 阅读器对 300,000 行 4 列 csv 文件进行了定时迭代。 csv.DictReader 花费的时间是csv.reader七倍

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

此外,profile 您的代码可以查明您大部分时间花在哪里。

【讨论】:

以上是关于在 python 中有效地处理一个大的 .txt 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python有效地填充给定一个非常大的表的矩阵?

尝试在python中有效地计算相关矩阵

如何在一个非常大的表中有效地选择

如何使用 Python 内置函数成功处理大量 .txt 文件?

在 R 中有效地设置非常大的数据帧

如何通过索引从一个非常大的列表中有效地删除元素?