簡體   English   中英

使用多線程讀取30GB文件

[英]Reading 30GB file using multithreading

我試圖讀取一個30GB(2500萬行)的巨大文件的文件。 我想寫一個代碼,它將創建一個線程池,每個線程將並行讀取1000行(第一個線程將讀取前1000行,第二個線程將讀取下一個1000,依此類推)。 我已經閱讀了整個文件並創建了線程池但是現在我被困住了,我怎么能確保每個線程只讀取1000行並且還跟蹤已讀取的行號,以便下一個線程不必讀取那些線。

答:如果它是可加入的,則所有線程的行數大致相等,您可以:

  1. 假設線程池大小為N,第一個線程尋找文件偏移0並讀取[0,30GB / N),第二個線程尋求偏移30GB / N,讀取[30GB / N,30GB / N * 2]等。
  2. 第二個線程可能不在一行的開頭,而是在一行的中間。 沒關系。 只需跳過paritial行,然后閱讀完整的行。 第一個線程可以以部分線結束。 沒關系,只需繼續閱讀,直到讀到'\\ n'。 剩下的線程做同樣的事情。

B.如果所有線程必須具有完全相同的行數,即1000行,您可以:

  1. 讓一個線程讀取整個文件,構建索引映射。 地圖的信息如line0~line999從偏移0開始,line1000~line1999從偏移13521開始,等等...
  2. 所有線程都從相應的偏移量中讀取文件,並讀取1000行。

方法A讀取文件1次。 方法B讀取文件2次。

使用方法A或B,您可以讓所有線程並行處理文件(轉換,提取,清理..)。 但是如果處理速度非常快,那么界限就是磁盤速度。 然后你的應用程序是IO綁定的。 您應該只有一個線程讀取文件並按順序進行處理。

暫無
暫無

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

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