web-dev-qa-db-ja.com

より多くのメモリとCPUリソースをプログラムに割り当てます

unzipを実行して巨大なファイルを解凍しています。ただし、CPU使用率は15%未満であり、RAMは8 GBのうち1〜1.2GBしか使用していません。

このunzipプログラムにより多くのCPUパワーとRAMを割り当てる方法はありますか?

ありがとうございました。

私はLubuntu16.04を使用しています

1
Faraz Durrani

プログラムは、組み込みの制限がない限り、取得できるすべてのメモリとCPUパワーを使用します。 unzipにはそのような組み込みの制限はありません。与える量を減らすことはできますが、増やすことはできません。デフォルトでは、必要なだけ取ることが許可されているためです。

解凍はメモリを大量に消費するプロセスではありません。巨大なアーカイブを解凍する場合の主なメモリコストは、unzipがファイルのリストをメモリに保持することです。

速度の制限要因は、CPUパワーまたはディスク(または、ネットワークに対してファイルを読み書きしている場合はネットワーク)である可能性があります。それはあなたのディスクがあなたのCPUに対してどれくらい速いかによります。プロセスがoneコアを100%使用しているかどうかを確認します。そうでない場合、それを高速化する唯一の方法は、入力/出力を高速化することです。これは、より高速なディスク、または入力と出力を別々のディスクに配置するように調整することを意味します。

プロセスが1つのコアを100%使用している場合は、並列化することで高速化できます。多くの圧縮形式では、形式が非常に適応性があるため、1つのファイルの解凍は本質的に並列化できません。圧縮は、繰り返されるパターンを探し、それらを前のパターンへの間接参照に置き換えることによって実現されます。一部の圧縮形式には、各ブロックを個別に解凍できる「再初期化ポイント」があります。私はこれが少なくともbzip2の場合であることを知っています。一部の圧縮ツールは、フォーマットがそれを必要としない場合でもこれを行います。しかし、私が知る限り、これはZipには当てはまりません。一方、Zipはアーカイブの各メンバーを個別に圧縮するため、各ファイルを個別に解凍することができます。したがって、nコアがある場合は、それらすべてをビジー状態に保ち、個別のファイルを解凍することができます(I/Oが高速である場合)。

問題は、並列の解凍実装を見つけることです。 p7Zip7z x -mmt=on foo.Zipまたは7z x -mmt=8(8コアを使用)でサポートしていると思いますが、p7Zipのドキュメントはあまり良くなく、これが並列化されることを確認していません。

(別の回答にコメントを追加できないため)
htopは、プロセス情報を表示するためのツールの1つです。 「S」列(ステータス)に「D」が表示されている場合は、プロセスがブロックされていることを意味し、通常はI/O操作が終了するのを待っています。そのボトルネックに対処するために、ネットワークまたはストレージ(RAIDまたはより高速なHDD/SSD/NVMeなど)の帯域幅を増やします。

iotopは、このようなボトルネックを検出するためのもう1つの便利なツールです。そのプロセスの100%I/O使用量が表示されます。

1
Mr. Donutz