【问题标题】:skipping first half of a 59GB fastq file to process last half: read line-by-line, or fgetpos?跳过 59GB fastq 文件的前半部分来处理后半部分:逐行读取,还是 fgetpos?
【发布时间】:2012-09-19 15:54:39
【问题描述】:

我有 2 ~59GB 的“.fastq”格式的文本文件。 fastq 文件是从测序仪读取的基因组学文件。每 4 行是一个新的读取,但这些行的大小是可变的。

文件大小大约为 59GB,大约有 211M 读取——这意味着,给或取,大约 211M*4 = 844M 行。我正在使用的程序 Bowtie 目前能够执行以下选项:

"--skip 105M --qupto 105M"

这实质上意味着“跳过前 105M 读取,只处理下一个 105M 读取。”通过这种方式,您可以分解文件的处理。问题是,它跳过的方式非常慢。它只是像往常一样读取前 105M 读取,但不处理它们。然后,一旦达到给出的读取值,它就会开始比较。

我想知道是否可以使用 C/C++ 的 fsetpos 之类的东西将位置设置为文件的中间[或任何地方],我意识到这可能会将我放在一行中间的某个位置,然后从那里找到第一次完整读取开始处理,而不是等待它读取大约 422M 行,直到它到达它需要去的地方。有没有人有在如此大的文件上执行 fsetpos 的经验,并且知道性能是否比目前的执行方式更好?

谢谢-- 尼克

【问题讨论】:

  • 你怎么知道你在哪条线上?打开一本随机书,在其中一页上找到任意字母。那封信之前有多少个句子?
  • 你能不能用一些东西来将文件预处理成多个文件,一次通过这样做?不确定它会有多大帮助,但如果你有超过 2 个块,它会节省额外的重复阅读跳过的行。
  • 你为什么不试试看它是如何工作的?
  • fastq 文件的本质是每四行 sn-p/read 都有一个格式,可以让我弄清楚我在哪里。换句话说,这就像打开一本书,在其中一页上随机任意字母,然后备份直到到达句子的开头,只有在 fastq 文件的情况下,读取是有编号的。因此,如果书中的每个句子都以“+ [3220243]”或表示该句子编号的内容开头。

标签: c++ genome fgetpos large-data


【解决方案1】:

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

对于大文件,性能通常优于读取数据。

一般来说,在文件内定位的过程:

  1. 请求读取文件的目录条目。
  2. 搜索目录以找到文件的磁道和扇区 位置。
  3. 注意:某些文件系统可能具有较大的目录扩展名 文件,因此需要读取更多数据。
  4. 在下一次读取时,硬盘被告知转到给定的轨道 和扇区,然后读入数据。

您正在节省所有先前数据通过通信端口进入内存(或被忽略)的时间。

【讨论】:

  • 好的——这很好。 [我也在 NFS 上执行此操作,但它仍然必须比读取顺序行更快。] 您刚才描述的本质是使用 fgetpos() 时会发生什么吗?我将谷歌“在文件 linux 中定位”。谢谢。
  • @NickLindberg:如果您认为它不错,请单击此旁边的复选标记。 :-)
  • 好电话。你能提供一个你的方法的例子吗?我的意思是,我并不想知道这在理想情况下如何工作[意味着我认为它会像你描述的那样工作],但是示例代码 sn-p 或库/系统调用是我所希望的。 fgetpos() 我要去的地方,但我不完全确定它的行为方式与您在上面描述的方式相同。
  • @NickLindberg:这是一般情况。一个好的起点是 GNU 编译器源代码和 Linux 内核。还要搜索硬盘组成。使用ftellgfgetpos
  • 糟糕。我的意思是 fsetpos,而不是 fgetpos。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2022-01-15
相关资源
最近更新 更多