UNIXの「分割」以外にファイルをN個のチャンクに分割するより速い方法があるかどうか疑問に思っています。
基本的に、私は大きなファイルを持っており、それらを小さなチャンクに分割して、それぞれを並行して操作したいと思います。
UNIXの「分割」以外にファイルをN個のチャンクに分割するより速い方法があるかどうか疑問に思っています。
基本的に、私は大きなファイルを持っており、それらを小さなチャンクに分割して、それぞれを並行して操作したいと思います。
split -b
行で分割するよりもCPU効率が高いものを使用していると思いますが、それでも入力ファイル全体を読み取り、各ファイルに書き込みます。のこの部分の実行のシリアル性がsplit
ボトルネックである場合は、を使用dd
してファイルのチャンクを並列に抽出できます。dd
並列プロセスごとに個別のコマンドが必要になります。これが1つのコマンドラインの例です(the_input_file
これが中央から少し抽出する大きなファイルであると仮定します):
dd skip=400 count=1 if=the_input_file bs=512 of=_output
count
これを機能させるには、との適切な値を選択する必要がありますbs
(上記の値は非常に小さいです)。各ワーカーはskip
、チャンクがオーバーラップしないように、の異なる値を選択する必要もあります。しかし、これは効率的です。シーク操作でdd
実装します。skip
もちろん、これは、他の同様のコンシューマープロセスと並行して、入力ファイルの指定されたチャンクを直接読み取ることができるようにデータコンシューマープロセスを実装するほど効率的ではありません。しかし、もしあなたがそれをすることができれば、あなたはこの質問をしなかっただろうと思います。
これがOSユーティリティであることを考えると、最高のパフォーマンスが得られるように最適化されていると考える傾向があります。
この質問を表示して(またはまたはman -k split
を実行してman split
)、の代わりに使用できる可能性のある関連コマンドを見つけることができますsplit
。
たとえばCで独自のソリューションを実装することを検討している場合は、独自の特定のシステム/環境といくつかのサンプルデータに対していくつかのベンチマークを実行し、使用するツールを決定することをお勧めします。
注:これを定期的に行う予定がない場合は、これについて考える価値がない可能性があります。先に進んで、必要なことを実行するツールを使用してください(この場合split
) 。