簡體   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