簡體   English   中英

多處理子任務繼續泄漏更多內存

[英]Multiprocessing child task continues to leak more memory

我有一個很大的定界文件。 我需要將一個函數應用於此文件中的每一行,每個函數調用都需要一段時間。 因此,我已將主文件分片為子文件,例如<shard-dir>/lines_<start>_<stop>.tsv並且正在通過pool.starmap將函數應用於每個文件。 由於我還希望保留結果,因此我將結果寫入相應的輸出文件中: <output-shard-dir>/lines_<start>_<stop>_results.tsv

我正在映射的功能看起來像:

# this is pseudo-code, but similar to what I am using
def process_shard_file(file):
    output_file = output_filename_from_shard_filename(file)
    with open(file, 'r') as fi, open(output_file, 'w') as fo:
        result = heavy_computation_function(fi.readline())
        fo.write(stringify(result))

然后通過以下方式啟動多處理:

shard_files = [...] # a lot of filenames

with Pool(processes=os.cpu_count()) as pool:
    sargs = [(fname,) for fname in shard_files]
    pool.starmap(process_shard_file, sargs)

當用htop監視我的計算機資源時,我發現所有內核都已滿htop 但是,我注意到內存使用量一直在不斷增加,直到達到交換...然后直到交換也已滿為止。

我不明白為什么會這樣,因為process_shard_file中的多個文件( n * cpu_cores )已成功完成。 那么為什么內存不穩定? 假設heavy_computation_function使用基本上相等的內存,而不管文件和result大小是否相等

更新資料


def process_shard_file(file):
    output_file = output_filename_from_shard_filename(file)
    with open(file, 'r') as fi, open(output_file, 'w') as fo:
        result = fi.readline()# heavy_computation_function(fi.readline())
        fo.write(result)

以上似乎並沒有引起此內存泄漏的問題,這是result
heavy_computation_function可以認為基本上是另一行要寫入輸出文件。

那么heavy_computation_function什么樣的呢?


def heavy_computation_function(fileline):
    numba_input = convert_line_to_numba_input(fileline)
    result = cached_njitted_function(numba_input)
    return convert_to_more_friendly_format(result)

我知道這仍然很模糊,但是我試圖看看這是否是一個普遍的問題。 我還嘗試將maxtasksperchild=1選項添加到我的Pool以真正嘗試防止泄漏無濟於事。

您的程序可以正常運行,但是由於資源泄漏而只能在自毀之前進行一小段時間。 人們可以選擇接受這種未經診斷的泄漏作為生活的事實,這種情況今天不會改變。

文檔指出有時會發生泄漏,並提供了一個maxtasksperchild參數來幫助處理它。 將其設置得足夠高,以便您可以從分攤多個任務的初始啟動成本中受益,但又要足夠低以避免交換。 讓我們知道如何為您服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM