簡體   English   中英

從python中的多個線程讀取單個文件

[英]Reading a single file from multiple threads in python

我在python中編寫了一個多線程解壓縮程序。 每個線程都需要訪問輸入文件的不同塊。

注1:無法加載整個文件,因為它的范圍從15 Gb到200 Gb; 我不是使用多線程來加速數據讀取,而是數據解壓縮,我只是想確保數據讀取不會減慢解壓縮速度。

注2:GIL不是問題,這里,因為主解壓縮器函數是C擴展,它調用Py_ALLOW_THREADS,因此在解壓縮時釋放GIL。 第二階段減壓使用numpy,也是無GIL的。

1)我假設它不能簡單地共享一個Decompressor對象(基本上包裝文件對象),因為如果線程A調用以下內容:

decompressor.seek(x)
decompressor.read(1024)

並且線程B也是這樣,線程A可能最終從線程B偏移讀取。 這個對嗎?

2)現在我只是讓每個線程創建自己的Decompressor實例,它似乎工作,但我不確定這是最好的方法。 我考慮過這些可能性:

  • 添加類似的東西

     seekandread(from_where, length) 

    到解壓縮器類獲取鎖,尋找,讀取和釋放鎖;

  • 創建一個等待讀取請求並以正確順序執行它們的線程。

那么,我錯過了一個明顯的解決方案嗎? 這些方法之間是否存在顯着的性能差異?

謝謝

如果您還沒有這樣做,可能需要使用Leader / Follower模式。
Leader線程將知道哪些段已經被處理,哪些段沒有,並且將自己分配下一個未處理的段,然后成為跟隨者,將領導留給池中的下一個可用線程。

你可以使用mmap。 請參閱mmap()與讀取塊

正如Tim Cooper所說,當你有隨機訪問時,mmap是一個好主意(多線程會使你看起來像這樣),並且他們可以共享相同的物理頁面。

CPython具有GIL,因此多線程不會提高CPU綁定任務的性能。

如果問題不是IO綁定(磁盤提供/存儲數據的速度比CPU解壓縮速度快),則可以使用多處理模塊 :每個進程打開文件並解壓縮給定的字節范圍。

暫無
暫無

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

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