【发布时间】:2009-11-24 23:31:57
【问题描述】:
在 ruby 中从处理许多小数据文件迁移到几个大数据文件时,我应该记住什么?
背景:我是一名生物信息学家,正在处理下一代测序数据,每次运行产生大约一百万个序列。我之前将一百万个序列中的每一个都保存到了自己的文件中,并对每个序列进行了一些处理步骤,为每个序列生成了几个文件。不幸的是,拥有数百万个文件使文件输入和输出成为主要瓶颈(并且也使备份变慢)。 (answers to this question 也不鼓励拥有数百万个文件)
我考虑使用 sqlite 来存储每个文件,但我想尽可能避免使用此选项,以避免添加依赖项。
我怀疑我应该只编写一个模块来处理大文件,并让所有处理脚本(作为独立进程运行)在想要进行输入或输出时使用这个模块。为处理类提供使用 StringIO 创建的文件流可能对此很有用,因为这样他们就不需要知道大文件是如何工作的。
为了避免在获取输入时必须读取整个大文件(我希望每个序列的处理都是一个独立的过程,以便对一个序列的分析不会破坏对另一个序列的分析),我'我必须跟踪我在大输入文件中的位置。尽管存在更复杂的进程间通信技术,但我可能只使用一个临时文件来存储 IO#seek 的字符位置。
我还必须记住,如果多个进程正在写入同一个文件,我将无法同时运行多个进程,并且大文件处理程序需要定期刷新其输出。
【问题讨论】: