私たちのバイオインフォマティクスアプリケーションには、大容量ファイル(最大900 MB、通常100 MB)があります。これらのファイルには、ゲノムの明確なテキスト表現が含まれており、基本的に文字シーケンスを含む1行のファイルです。
データは場所に基づいて参照されます。例えば、染色体7は位置1から始まり、位置158937463で終わる。通常、約400文字の小さな部分を抽出します(たとえば、4,120,000から4,120,400まで)。
この目的のためにRubyで書かれたユーティリティがあります。https://github.com/sfcarroll/bio-fasta-readファイルを最初から読み取って機能します。
これらの読み取り操作を複数回実行すると、アプリケーションの速度が遅くなります。キャッシュに使用できるオプションを知りたいです。ソースデータは決して変更されませんが、範囲は頻繁に変更されます。私たちは、128 GBのRAMを搭載したシステムでUbuntu Server 14 x64を実行しています。
パフォーマンスを向上させるためのOSレベルの方法はありますか?ファイル全体をメモリにロードするか、リクエストを何らかの方法でキャッシュできますか?
編集する
役に立ついくつかのオプション(何らかの方法でファイルキャッシュに多くのメモリを割り当てるなど)がある場合は、ポインタが非常に便利であると付け加える必要があります。特定の方法で調整する必要がある場合は、専用サーバーを使用してこれらのファイルを読み取ることを検討できます。
編集2 私たちはデュアルSSD(レイド可能)と128GBのRAMを備えたXeon E5-1650 6コアCPUを実行しています。
答え1
Linuxカーネルはキャッシュ管理を自動的に実行します。 RAMにロードされたすべてのエントリは、他のプロセスでRAMが必要になり、使用可能なメモリがなくなるまでそのまま残ります。したがって、LinuxカーネルではRAMがいっぱいになっている必要があります。システムには128 GBのRAMがあり、これは100〜1000 MBのファイルを保存するのに十分です。
大容量ファイルを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 if=入力ファイル =の出力ファイル
これは400バイトの論理ブロックサイズを定義し、dd
入力ファイル()if
の最初の10300個の「論理ブロック」をスキップするように指示します。 10,300は4,120,000¼ 400です。次に、count=1
400バイトブロック()を読み取り、それを出力ファイル(of
)に書き込みます。仕様を省略すると、of
標準
dd
出力が作成され、パイプで接続できます。
開始点(オフセット)がブロックサイズの整数倍を保証しない場合(または下痢であっても)、次のようなより厳しい操作を実行できます。
(dd bs=10000 スキップ=412 個数=0; dd bs=400 個数=1 個=出力ファイル)<入力ファイル
または
(dd bs=4120000 スキップ=1個数=0; dd bs=400個数=1個=出力ファイル)<入力ファイル
どこ
- 同様に、仕様を省略することができ、
of
これは標準出力に書き込まれます。 - 指定せず
dd
に実行すると、標準入力から読み込まれます。if
完全なコマンドグループへの標準入力は(dd …; dd …)
最後から来ます。< your_input_file
- 最初のコマンドは検索のみである
dd
ため、データの読み書きはできません。count=0
dd
どちらのコマンドも同じI / Oリダイレクトから標準入力を受け取るため、最初のコマンドで実行された照会は2番目のコマンドで表されるファイルポインタに影響します。