簡體   English   中英

數據處理中多個文件的實時處理(Python Multiprocessing)

[英]Real-time handling of multiple files in data processing (Python Multiprocessing)

該程序正在監視文件夾received_dir並實時處理收到的文件。 處理完文件后,應刪除原始文件以節省磁盤空間。 我正在嘗試使用Python multiprocessingPool 我想檢查當前方法是否存在任何技術缺陷。

當前代碼中的一個問題是程序要等到隊列中的所有20個文件都處理完后再開始下一輪,因此在某些情況下(即各種文件大小)可能效率低下。

from multiprocessing import Pool
import os
import os.path

Parse_OUT="/opt/data/"

def parser(infile):
    out_dir=date_of(filename)
    if not os.path.exists(out_dir):
        os.mkdir(out_dir)

    fout=gzip.open(out_dir+'/'+filename+'csv.gz','wb')
    with gzip.open(infile) as fin:
        for line in fin:
            data=line.split(',')
            fout.write(data)
    fout.close()
    os.remove(infile)

if __name__ == '__main__':
    pool=Pool(20)
    while True:
        targets=glob.glob(received_dir)[:10]
        pool.map(parser, targets)
    pool.close()

我看到幾個問題:

  1. if not os.path.exists(out_dir): os.mkdir(out_dir) :這是一個競爭條件。 如果兩個 worker 試圖同時創建同一個目錄,一個會引發異常。 不要做 if 條件。 只需調用os.makedirs(out_dir, exist_ok=True)

  2. 不要用字符串添加來組合文件路徑。 只需執行os.path.join(out_dir, filename+'csv.gz') 這更干凈,故障狀態更少

  3. 即使沒有出現新目錄,也不必在 while True 循環中旋轉,您可以使用 Linux 上的 inotify 機制來監視目錄的更改。 如果實際上有任何事情要做,那只會喚醒您的過程。 查看pyinotify: https : //github.com/seb-m/pyinotify

  4. 由於您提到您對批處理不滿意:您可以使用pool.apply_async在新操作可用時啟動它們。 您的主循環不會對結果做任何事情,因此您可以“開火並忘記”

  5. 順便說一句,你為什么要開始一個有 20 個工人的池,然后你一次只啟動 10 個目錄操作?

暫無
暫無

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

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