我需要处理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(...)
我怎么能改善这个?
答案 0 :(得分:7)
除非文件中的行确实存在,真的大,否则不要在每行打印进度。打印到终端非常慢。打印进度例如每100或每1000行。
使用可用的操作系统工具获取文件大小 - os.path.getsize()
,请参阅Getting file size in Python?
摆脱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()
所以不将所有内容存储到内存中