我在python中編寫了一個多線程解壓縮程序。每個線程需要訪問不同的輸入文件塊。從python中的多個線程讀取單個文件
注1:無法加載整個文件,因爲它的範圍從15 Gb到200 Gb;我沒有使用多線程來加速數據讀取,但數據解壓縮,我只是想確保數據讀取不會減慢解壓。注意2:GIL不是問題,在這裏,由於主解壓縮函數是一個C擴展,它調用Py_ALLOW_THREADS,所以GIL在解壓縮時被釋放。第二階段減壓使用也是無GIL的numpy。
1)我認爲這是行不通的去分享一個解壓縮對象(這基本上包裝了一個文件對象),如果線程A調用以下日期:
decompressor.seek(x)
decompressor.read(1024)
和線程B不相同,螺紋A可能最終從線程B偏移量讀取。它是否正確?
2)現在我只是讓每個線程創建自己的Decompressor實例,它似乎工作,但我不知道這是最好的方法。 我考慮這些可能性:
添加類似
seekandread(from_where, length)
到獲取鎖時,尋求,讀取和釋放鎖解壓縮類;
創建一個線程,等待讀取請求並按正確的順序執行它們。
那麼,我是否錯過了一個明顯的解決方案?這些方法之間是否存在顯着的性能差異?
感謝
以多線程方式讀取文件實際上會減慢硬盤驅動器進程的速度。針必須從一個地方跳到另一個地方,而不是以迭代方式工作。您應該在處理文件之前加載文件。 – 2012-02-07 12:16:17
無法加載整個文件,因爲它的範圍從15 Gb到200 Gb;我沒有使用多線程來加速數據讀取,但數據解壓縮,我只是想確保數據讀取不會減慢解壓。 – Alberto 2012-02-07 12:21:16
當然,這可能或可能不適用於SSD。我不知道這個問題。您不應該在硬件上進行中繼。一旦SSD足夠普及,以多線程方式執行I/O可能會很有效。 – 2012-02-07 12:21:56