簡體   English   中英

寫入鎖定的文件有時找不到內容(打開腌制的熊貓DataFrame時)-EOFError:輸入用盡

[英]Write-locked file sometimes can't find contents (when opening a pickled pandas DataFrame) - EOFError: Ran out of input

這是我的情況:我需要在一個群集上運行300個進程(它們是獨立的), 並將它們的一部分數據全部添加到同一DataFrame中(它們還需要在讀取文件之前讀取文件)。 他們可能需要在整個運行時中多次執行此操作。

因此,我嘗試通過portalocker軟件包使用寫鎖定文件。 但是,我遇到了一種錯誤,我不知道它從哪里來。

這是每個進程將寫入同一文件的基本代碼:

with portalocker.Lock('/path/to/file.pickle', 'rb+', timeout=120) as file:
    file.seek(0)
    df = pd.read_pickle(file)

    # ADD A ROW TO THE DATAFRAME

    # The following part might not be great,
    # I'm trying to remove the old contents of the file first so I overwrite
    # and not append, not sure if this is required or if there's
    # a better way to do this.
    file.seek(0)
    file.truncate()
    df.to_pickle(file)

以上大部分時間都是有效的。 但是,我擁有寫鎖定的同步進程越多,在pd.read_pickle(file)階段得到的EOFError錯誤pd.read_pickle(file)

EOFError: Ran out of input

追溯時間很長,而且很復雜。

無論如何,到目前為止,我的想法是由於上面的代碼有時可以工作,所以上面的代碼必須是*(盡管它可能很凌亂,而且我不介意聽到做相同事情的更好方法)。

但是,當我有太多嘗試寫鎖定的進程時,我懷疑文件沒有節省時間或其他東西,或者至少在某種程度上,下一個進程尚未看到上一個進程已保存的內容。

有辦法解決嗎? 我嘗試添加在time.sleep(0.5)語句在我的代碼(前read_pickle ,后to_pickle ),我不認為它幫助。 有誰了解可能發生的事情或知道更好的方法來做到這一點?

另請注意,我認為寫鎖定不會超時。 我嘗試對過程進行計時,並且還在其中添加了一個標志,以在寫鎖超時時進行標志。 雖然有300個進程,並且它們可能會嘗試以不同的速率進行寫入,但通常我估計每秒大約有2.5次寫入,這似乎不應該使系統超載嗎?*

*腌制的DataFrame的大小為幾百KB。

也許這是一個模糊的問題,但是由於我設法解決了這個問題並更好地了解了情況,所以我認為將我發現的內容發布在這里是有益的,希望其他人也可以找到。 在我看來,這是一個可能也可能會引起其他問題的問題。

感謝“ portalocker” github頁面的幫助和回答: https : //github.com/WoLpH/portalocker/issues/40

問題似乎是我在集群上執行此操作。 結果,文件系統有點復雜,因為進程在多個節點上運行。 保存的文件“同步”起來所花費的時間可能比預期的長,並且可以在不同的運行進程中看到。

對我來說似乎起作用的是刷新文件並強制系統同步,此外(尚不確定是否可選),此后添加更長的“ time.sleep()”。

根據“ portalocker”開發人員的說法,文件在群集上同步可能花費不可預測的時間,因此您可能需要更改睡眠時間。

換句話說,在保存文件后添加以下內容:

df.to_pickle(file)
file.flush()
os.fsync(file.fileno())

time.sleep(1)

希望這可以幫助其他人。

暫無
暫無

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

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