2012-09-27 67 views
0

我有「.fastq」格式的2〜59GB文本文件。 fastq文件是基因組學讀取來自音序器的文件。每4行是一個新的讀取,但行數是可變的。跳過59GB fastq文件的前半部分處理後半部分:逐行閱讀還是fgetpos?

的文件大小是大致59GB,並且有大約211M reads--這意味着,給予或採取,approximatley 211M * 4 = 844M線。我使用的程序,蝴蝶結,目前已做到以下選項的能力:

「--skip 105M --qupto 105M」

這基本上意味着「跳過第一105M讀取並只處理了到下一個105M的讀數。「通過這種方式可以分解文件的處理。問題是,它跳過的方式非常慢。它通常會讀取前105M的讀數,但不處理它們。然後一旦達到它給出的讀取值,它就開始比較。

我想知道如果我可以使用像C/C++的fsetpos這樣的位置來設置文件中間的位置[或任何地方],我可能會把我放在一行中間的某個位置,然後從那裏找到第一個完整讀取的開始處理,而不是等待它讀取大約422M行,直到它到達需要去的地方。有沒有人有過在如此龐大的文件上做fsetpos的經驗,並且知道性能是否比它目前正在做的更好?

Thanks-- 尼克

+2

你怎麼知道你在哪條線上?打開一本隨機的書,在其中一頁上找到任意字母。那封信之前有多少句話? – Joe

+0

你可以用一些東西來預處理文件到多個文件中,這樣做只需一次?不知道它有多大幫助,但如果你有兩個以上的塊,它可以節省多餘的雙線閱讀。 – Joe

+0

你爲什麼不試試看看它是如何工作的? –

回答

0

是的,你可以定位到使用C++文件的中間。

對於大文件,其性能通常比讀取數據要好。

通常,對於一個文件中定位的過程:

  1. 的請求時讀取該文件的目錄項。
  2. 該目錄被搜索以找到文件 位置的軌道和扇區。
  3. 注:有些文件系統可能有較大的 文件目錄的擴展,從而更多的數據需要被讀取。
  4. 下一個讀,硬盤驅動器被告知到指定軌道 和部門,然後在數據讀取。

您正在節省時間從所有以前的數據通過通信端口進入內存(或忽略)。

+0

好的 - 這很好。 [我也是通過NFS來做這件事,但它仍然要比讀取順序行更快。]你剛剛描述的實質上是什麼時候使用fgetpos()?我將谷歌「定位在一個文件的Linux」。謝謝。 – HodorTheCoder

+0

@NickLindberg:如果您認爲它很好,請點擊旁邊的複選標記。 :-) –

+0

良好的通話。你能提供一個你的方法的例子嗎?我的意思是,我不太想知道這是如何在理想的情況下工作的(意思是我認爲它可以像你所描述的那樣工作),但是一個示例代碼片段或庫/系統調用就是我所希望的。 fgetpos()我在哪裏,但我不完全確定它的行爲如上所述。 – HodorTheCoder

相關問題