繁体   English   中英

Python中大文件中的行分割引起的内存问题

[英]Memory issues with splitting lines in huge files in 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

即,如果我不分线,则内存使用会急剧下降。 有什么办法可以解决这个问题,也许是一些聪明的方法来存储分割行而不填满主存储器?

感谢您的时间。

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

与其将整个文件读入内存,不如使用生成器。

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))

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

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

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提出的方法要快得多,因为您只需读取一次文件行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM