打开25GB文本文件进行处理

时间:2014-09-16 22:14:48

标签: python performance

我需要处理25GB文件。这是我目前正在做的事情,但开放需要很长时间:

collection_pricing = os.path.join(pricing_directory, 'collection_price')
with open(collection_pricing, 'r') as f:
    collection_contents = f.readlines()

length_of_file = len(collection_contents)

for num, line in enumerate(collection_contents):
    print '%s / %s' % (num+1, length_of_file)
    cursor.execute(...)

我怎么能改善这个?

3 个答案:

答案 0 :(得分:7)

  1. 除非文件中的行确实存在,真的大,否则不要在每行打印进度。打印到终端非常慢。打印进度例如每100或每1000行。

  2. 使用可用的操作系统工具获取文件大小 - os.path.getsize(),请参阅Getting file size in Python?

  3. 摆脱readlines()以避免将25GB读入内存。而是逐行阅读和处理,参见例如How to read large file, line by line in python

答案 1 :(得分:3)

两次通过文件:一次计数行,一次打印。永远不要在文件大小上调用readlines - 您最终会将所有内容交换到磁盘。 (实际上,一般情况下从不打电话给readlines。它是silly。)

(顺便说一句,我假设您实际上正在使用这些行,而不仅仅是行数 - 您在那里发布的代码并没有实际使用文件中的任何内容除了其中的换行符数量。)

答案 2 :(得分:1)

结合上面的答案,这是我修改它的方式。

size_of_file = os.path.getsize(collection_pricing)
progress = 0
line_count = 0

with open(collection_pricing, 'r') as f:
    for line in f:
        line_count += 1  
        progress += len(line)
        if line_count % 10000 == 0:
            print '%s / %s' % (progress, size_of_file)

这有以下改进:

  • 不使用readlines()所以不将所有内容存储到内存中
  • 每10,000行仅打印
  • 使用文件大小而不是行数来衡量进度,因此不必重复文件两次。