提高明文文件读取的性能

提高明文文件读取的性能

在我们的生物信息学应用程序中,我们有大文件(高达 900MB,通常为 100MB)。这些文件包含基因组的清晰文本表示,本质上是带有字符序列的单行文件。

数据按位置引用,例如,7 号染色体从位置 1 开始,到位置 158937463 结束。我们通常提取大约 400 个字符的一小部分,例如:从位置 4,120,000 到 4,120,400。

我们有一个用 Ruby 编写的实用程序用于此目的:https://github.com/sfcarroll/bio-fasta-read它的工作原理是从头开始阅读文件。

我们多次执行这些读取操作,它们会减慢我们的应用程序的速度。我想知道有哪些选项可用于缓存?源数据永远不会改变,但范围会经常改变。我们在具有 128GB RAM 的计算机上运行 Ubuntu Server 14 x64。

是否有某种操作系统级别的方法可以提高性能?也许将整个文件加载到内存中或以某种方式缓存请求?

编辑

我应该补充一下,如果有一些选项(例如以某种方式向文件缓存分配更多内存)会有所帮助,那么指针将不胜感激。如果需要以特定方式进行调整,我们可以考虑使用专用服务器来读取这些文件。

编辑2 我们运行的是 Xeon E5-1650 六核 CPU 和双 SSD(可以进行突袭),以及 128GB RAM。

答案1

Linux 内核自动进行缓存管理。加载到 RAM 中的所有内容都会保留在那里,直到另一个进程需要 RAM 并且没有更多可用的内存为止。所以在linux内核中RAM应该始终是满的。您的系统有 128GB RAM,对于 100-1000MB 的文件来说绰绰有余。

要将一个大文件加载到 RAM 中只需cat

cat huge_file > /dev/null 2>&1

所有输出都发送到/dev/null,但为此它必须通过系统 RAM。执行此操作时,您可以观察如何Cached增加/proc/meminfo

结束后cat,执行 Ruby 应用程序。 Ruby 应用程序现在读取大文件的缓存版本。

答案2

用于dd读取文件的一部分而不读取其前面的所有内容。对于您的示例(读取字节 4,120,000-4,120,400),您可以使用

dd bs=400 跳过=10300 计数=1 如果=你的输入文件  的=你的输出文件

这定义了 400 字节的逻辑块大小,然后告诉dd跳过输入文件 ( if) 的前 10300 个“逻辑块”。 10300 是 4,120,000 ÷ 400。然后它读取count=1400 字节的一个块 ( ) 并将其写入输出文件 ( of)。如果省略规范ofdd将写入标准输出,以便您可以通过管道将其传输到某些内容。

如果起点(偏移量)不能保证是块大小的整数倍(或者即使是),您可以做更棘手的事情,例如

(dd bs=10000 跳过=412 计数=0;dd bs=400 计数=1 of=你的输出文件) <你的输入文件

或者

(dd bs=4120000 跳过=1 计数=0;dd bs=400 计数=1 of=你的输出文件) <你的输入文件

在哪里

  • 同样,您可以省略of规范,这将写入标准输出。
  • 如果您dd在没有if指定的情况下运行,它将从标准输入中读取。整个命令组的标准输入(dd …; dd …)来自于末尾。< your_input_file
  • 第一个dd命令不会读取或写入任何数据,因为count=0;它只是寻求。
  • 由于这两个dd命令从相同的 I/O 重定向获取标准输入,因此第一个命令完成的查找将影响第二个命令看到的文件指针。

相关内容