6

我对 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 万行中制作一本字典,我认为这可能是它对于较大文件的速度如此之慢的原因。

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

4

2 回答 2

6

Acollections.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)
于 2012-11-15T16:28:52.127 回答
3

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

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

将此与katrielalex 的使用建议结合起来collections.deque,您应该会看到一个不错的加速。

此外,分析您的代码以查明您花费大部分时间的位置。

于 2012-11-15T17:02:35.310 回答