我試圖讀取30GB(2500萬行)的大文件的文件。我想編寫一個代碼,它將創建一個線程池,每個線程將並行讀取1000行(第一個線程將讀取前1000行,第二個線程讀取下一個1000行,等等)。 我已經閱讀了整個文件並創建了線程池,但現在我堅持如何確保每個線程只讀取1000行,並跟蹤已讀取的行號以便下一個線程不必讀取那些線。使用多線程讀取30GB文件
1
A
回答
0
A.如果是acceaptable所有的線程都行大致均等的,您可以:
- 假設線程池的大小是N,1號線力求文件偏移0和閱讀[0,30GB/N ),第二個線程尋求抵消30GB/N,讀取[30GB/N,30GB/N * 2)等。
- 第二個線程可能不在一行的開頭,而是在一行的中間。沒關係。只需跳過paritial行,並閱讀完整的行。第一條線可以以部分線結束。沒關係,只要繼續閱讀,直到閱讀'\ n'。其餘的線程做同樣的事情。
B.如果所有線程都必須有行正好euqal數,這是說1000線,您可以:
- 有一個線程讀取整個文件,建立索引地圖。該地圖具有像line0〜line999開始偏移量0,線1000〜line1999開始偏移量13521等信息...
- 所有線程從相應的偏移讀取文件,並讀取1000行。
方法A讀取文件1次。方法B讀取文件2次。
使用方法A或B,可以使所有線程並行處理文件(轉換,提取,清理..)。但是,如果處理速度非常快,則界限就是磁盤速度。然後你的應用程序被IO綁定。你應該只需要一個線程讀取文件並連續執行處理。
相關問題
- 1. 多線程讀取文件
- 2. 使用PHP Pthread同時讀取多個CSV文件(多線程)
- 3. 通過多線程讀取文件
- 4. 如何使用多線程讀取文件?
- 5. 文件讀取寫入使用多線程
- 6. 使用線程提高磁盤讀取性能(多個文件)
- 7. 讀取使用多線程Java中
- 8. 只使用多線程讀取一行
- 9. 用多線程讀取ifstream的相同文件(pthread)
- 10. 用多線程讀取單個文件:應該加快速度?
- 11. 用mmap讀取文件中的多線程C
- 12. 多線程MSMQ讀取
- 13. 讀取多個線程
- 14. 多線程Zip文件閱讀器
- 15. Java使用掃描儀讀取文件,然後讀取線
- 16. C信號量線程讀取文件
- 17. 使用Python的多線程讀寫文件
- 18. 使用getline從文件讀取多行?
- 19. 使用多線程讀取文件時的同步和異步操作
- 20. 如何使用多線程讀取大量文件,請幫助我!
- 21. 在java中使用線程概念讀取N個文件
- 22. c#多線程文件讀取和頁面解析
- 23. 從同一文件讀取多個線程
- 24. 如何多線程讀取C++ 11中的文件?
- 25. 以2KB大小讀取python中的多線程文件。
- 26. spring批處理多線程文件讀取
- 27. 如何提高多線程文件讀取的性能?
- 28. 從python中的多個線程讀取單個文件
- 29. 多從在bash一個txt文件讀取(線程)
- 30. PHP讀取30K線文件
一旦你解決了這個問題,你使用磁力驅動器?無論如何,這將會是IO界限。 –
讓1個線程讀取大塊(30GB)通常會比25000個線程讀取小塊快。 25000個線程有很多開銷,如果它是1個文件駐留在1個磁盤上,那麼每個線程都必須等待隊列中的訪問時間。 –
您通常應該只有一個線程處理外部資源,例如文件。不要試圖分發不會提高性能的I/O,而是讓讀者將每個捆綁包發佈到併發隊列中和/或發送給執行程序任務。 – chrylis