簡體   English   中英

數據的多處理加載並提交到sqlalchemy

[英]Multiprocessing loading of data and committing to sqlalchemy

我正在從文件加載數據。 我有很多文件,因此有一些進程正在加載文件列表:

 with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
    for x, y, z in executor.map(load_my_file, path_list):

加載我的文件:加載數據,將“ USERS”和“ POSTS”存儲在兩個字典中,然后將它們返回,將用戶和帖子分別合並為一個字典,然后批量提交。

每個用戶可能有很多帖子,但是在文件中,每個記錄只是一個帖子和一個用戶在一起。 因此,這就是字典背后的原因,因此在使用sqlalchemy進行插入時,我沒有主鍵重復項。

但是,這會占用大量內存。 我大約有160萬條記錄,有60萬個用戶,我的python程序正在消耗大量的內存(超過了我的16GB RAM所允許的內存)。

我調查了使用session.merge的過程,但似乎每次調用它都會查詢數據庫,這使過程非常緩慢。 還有其他解決方法嗎? 我希望能夠在每個流程中進行提交,而不是在最后將所有內容合並為一個大字典,但是我不想破壞任何關系或出現主鍵錯誤。

奇怪的是,並行加載80個本地文件比一次加載一個要快得多。 我可能會為此提出一些理由。

但是沒問題。 您可以按原樣將數據導入到臨時的非規范化表中。 之后,使用SQL查詢將數據復制到目標規范化表。 然后刪除臨時表(如果需要,則將其截斷)。 另外,請查看您的SQLAlchemy查詢:不僅merge還會降低性能。 實際上,通過add_all進行的“大量”插入不會變成單個插入。 您將使用帶有字典列表的insert查詢: 我正在用ORM插入400,000行,這確實很慢!

我調查了使用session.merge的情況,但每次調用它似乎都在查詢數據庫

更糟的是。 它應該檢查記錄的存在(第一個查詢),然后插入或更新記錄(第二個查詢)。 因此,將其用於處理大量數據似乎很可疑。

暫無
暫無

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

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