Python for循环导致系统崩溃

时间:2014-03-28 02:14:29

标签: python performance for-loop bigdata

我需要查找包含特定字符串的文本文件的所有行,并将每行写入不同的文本文件中。如何改进我的代码以防止系统崩溃,以便首先读取大量文本文件(6GB大小)的5,000,000,000行?编译代码后,我的电脑运行缓慢,并突然冻结。即使我停止编译过程,内存仍然被占用,同样的问题出现了。我的IDE是Spyder,我使用的是Python 2.7。 谢谢!

我的代码是:

import fileinput

ot = 'N'
j = 1
i = 1
string = "ABCD"

for line in fileinput.input(['/../myfile.txt']):
    if i<=5000000000:
        if string in line:
            output = open(ot + str(j) + '.txt', 'w')
            output.write(line)
            output.close()
            j += 1
        i += 1

4 个答案:

答案 0 :(得分:5)

您可以尝试以下代码:

file_input = open('mhyfile.txt','r')
for line in file_input:
    #Your code here

for line in file_input:循环将逐行读取文件。但我在我的linux系统中测试并发现fileinput.input()不再使用内存。我想你应该提供更多关于你问题的信息。

一个可能的问题是您将太多文件写入磁盘并导致系统崩溃。您可以尝试将选定的行写入一个文件,并标记行号j

答案 1 :(得分:3)

from itertools import izip
ot = 'N%d.txt'
j = 1
lim = 5*10**9
with open('myfile.txt') as f:
    #the xrange part replaces the i < 5e9 thing you had.
    for line, _ in izip(f,xrange(lim)):
        if 'ABCD' in line:
            output = open(ot % j, 'w')
            output.write(line)
            output.close()
            j += 1

这应该运行正常,但如果你的文件很大,可能需要一段时间,尽管它不会占用太多内存。

修改
我添加了izip以避免吃掉大量的内存。 izip就像zip一样,除了它返回一个生成器而不是列表。

答案 2 :(得分:1)

选择迭代器的第一个 limit 项的规范方法是使用islice itertools - islice(my_file, limit)my_file.readlines()[:limit]类似,不同之处在于它避免将整个文件读入内存。只计算带有给定字符串的行只是稍微复杂一点:使用生成器表达式来获取那些行,然后islice 那些

from itertools import islice
ot = 'N%d.txt'
limit = 5000000000  

with open('myfile.txt') as f:
   lines = (line for line in f if 'ABCD' in line)
   for j, line in enumerate(islice(lines, limit), start=1):
       with open(it % j, 'w') as out:
          out.write(line)

答案 3 :(得分:-1)

试试这个:

file_num = 1

with open('myfile.txt', 'r') as file:
    for i in range(5000000000):
        if file.readline(i) == 'ABCD':
            with open('N' + file_num + '.txt', 'w') as write_file:
                write_file.write(file.readline(i))
                file_num += 1

不确定它对碰撞有多好,但它更清洁。提出以下问题。