在ruby中从处理许多小数据文件迁移到几个大文件

在ruby中从处理许多小数据文件迁移到几个大文件,ruby,file-io,Ruby,File Io,在ruby中从处理许多小数据文件迁移到几个大数据文件时,我应该记住什么 背景:我是一名生物信息学家,正在处理下一代测序数据,该数据每次运行产生约一百万个序列。我之前将一百万个序列中的每一个都保存到自己的文件中,并对每个序列执行了一些处理步骤,为每个序列生成了几个文件。不幸的是,拥有数百万个文件使文件输入和输出成为一个主要瓶颈(同时也使备份速度变慢)。(也不鼓励拥有数百万个文件) 我考虑过使用sqlite来存储每个文件,但如果可能的话,我希望避免使用这个选项,以避免添加依赖项 我怀疑我应该编写一个

在ruby中从处理许多小数据文件迁移到几个大数据文件时,我应该记住什么

背景:我是一名生物信息学家,正在处理下一代测序数据,该数据每次运行产生约一百万个序列。我之前将一百万个序列中的每一个都保存到自己的文件中,并对每个序列执行了一些处理步骤,为每个序列生成了几个文件。不幸的是,拥有数百万个文件使文件输入和输出成为一个主要瓶颈(同时也使备份速度变慢)。(也不鼓励拥有数百万个文件)

我考虑过使用sqlite来存储每个文件,但如果可能的话,我希望避免使用这个选项,以避免添加依赖项

我怀疑我应该编写一个且只有一个模块来处理大文件,并让所有处理脚本(作为独立进程运行)在需要输入或输出时使用该模块。为处理类提供一个用StringIO创建的文件流可能对此很有用,因为这样他们就不需要知道大文件是如何工作的

为了避免在获取输入时必须读取整个大文件(我希望每个序列的处理是一个独立的过程,这样一个序列的分析就不会破坏另一个序列的分析),我必须跟踪我在大输入文件中的位置。虽然存在更复杂的进程间通信技术,但我可能只使用一个临时文件来存储IO#seek的字符位置


我还必须记住,如果多个进程写入同一个文件,我将无法同时运行多个进程,大型文件处理程序将需要定期刷新其输出。

如果这只是存储“一堆文件”您可能只需要一个简单的键/值存储(如BDB),它可以很容易地扩展到任何RDBMS,包括MySQL、SQLite,甚至像Tokyo Cabinet这样的键/值存储


SQLite成为这样一个问题的原因是什么?强健的数据存储机制可能是处理“文件堆”系统的更好方法。

我不知道您的具体情况,但您描述的应用程序--我想存储一百万件东西,我想快速灵活地访问它们--对我来说听起来像一个数据库。通过避免使用像sqlite这样的工具,您不必避免依赖关系;你可能在用一种依赖换另一种依赖

如果您必须推出自己的基于文件的解决方案,则不必从一个极端走向另一个极端。1000个中等大小的文件,分布在10个子目录中,怎么样?这些中等大小的文件可能是
.tar
归档文件或类似的文件(伪装的目录),从代码的角度来看,这些文件的行为可能与您习惯处理的100万个小文件非常相似。此外,这些
.tar
文件将保持可直接从命令行访问,无需任何特殊软件

也许这些都是疯狂的想法,但是如果你想避免一个数据库,而是快速而实用地结合起来,考虑一些不需要你建立道德等同于你自己的DB系统的选项。