在Python中的大文件中拆分行的内存问题

时间:2015-05-04 15:57:10

标签: python

我试图从磁盘读取一个巨大的文件(~2GB)并将每一行拆分成多个字符串:

def get_split_lines(file_path):
    with open(file_path, 'r') as f:
        split_lines = [line.rstrip().split() for line in f]
    return split_lines

问题是,它试图在内存中分配数十和数十GB。我发现,如果我按以下方式更改代码,就不会发生这种情况:

def get_split_lines(file_path):
    with open(file_path, 'r') as f:
        split_lines = [line.rstrip() for line in f]    # no splitting
    return split_lines

即,如果我不拆分线路,内存使用量会大幅下降。 有没有办法解决这个问题,也许有一些聪明的方法来存储分割线而不填满主存储器?

感谢您的时间。

2 个答案:

答案 0 :(得分:4)

拆分后,您有多个对象:元组加上一些字符串对象。除了构成原始字符串的实际字符集外,每个对象都有自己的开销。

不是将整个文件读入内存,而是使用生成器。

def get_split_lines(file_path):
    with open(file_path, 'r') as f:
        for line in f:
            yield line.rstrip.split()

for t in get_split_lines(file_path):
    # Do something with the tuple t 

这并不妨碍您编写类似

的内容
lines = list(get_split_lines(file_path))

如果确实需要将整个文件读入内存。

答案 1 :(得分:1)

最后,我最终存储了一条剥离的行列表:

with open(file_path, 'r') as f:
    split_lines = [line.rstrip() for line in f]

而且,在我的算法的每次迭代中,我只是简单地重新计算分割线:

for line in split_lines:
    split_line = line.split()
    #do something with the split line

如果你能够像我一样保留内存中的所有行,并且你必须不止一次地浏览所有文件,这种方法比@chepner提出的方法更快,因为你只读了一次文件行