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

Python中大文件中拆分行的内存问题,python,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_l

我试图从磁盘读取一个巨大的文件(~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建议的方法要快,因为您只需读取一次文件行。

内存没有填满。
在逻辑上不正确,内存仍会被消耗,但会比前面描述的情况少。拆分这些行后,您需要如何处理它们?在这里使用生成器有意义吗?@shuttle87没有,因为我真的会把它们都准备好,而不会在每次返回生成器时重新计算拆分。为什么你需要重复读取这么大的文件?你试图解决的问题是什么?具体来说,对于您试图解决的问题来说,将所有字符串保存在内存中是否是一项困难的要求?我这样问是因为这似乎是一个