私はしばしばサーバー間またはaws s3に何百万もの小さなファイル(小さな画像、txt、json)を転送する必要があります(ファイルあたり平均5〜50,000個)。
zip / tar -cfに加えて、転送速度を最適化するために単一のファイルにマージするより高速な方法はありますか?
答え1
似たようなものtar cz * | ssh <host> "tar xfc -"
?心から、問題は何ですかtar
?このコマンドは中間ファイルを生成しません。
答え2
他の答えでアイデアを開発すると、ローカルでファイルを作成せずにパイプを介して情報を送信できますtar
。コマンドは次のようになります。
tar cf - * | aws s3 cp - s3://some-bucket/archive.tar
このコマンドの利点は、コマンドを並列に実行できることtar
ですaws
。圧縮を追加することもできます(これは再び並列に実行されます)。
tar cf - * | gzip -c | aws s3 cp - s3://some-bucket/archive.tar.gz
作業を簡単にするには、次を使用する代わりにファイルの最上位ディレクトリを使用できます*
。
tar cf - top_level_directory | aws s3 cp - s3://some-bucket/archive.tar
tar cf - top_level_directory | gzip -c | aws s3 cp - s3://some-bucket/archive.tar.gz
他の答えからインスピレーションを得て使用することができますcpio
。より速く見え、より小さなファイルを生成します。
ls |cpio -o |gzip -c | aws s3 cp - s3://some-bucket/archive.cpio.gz
答え3
はい、さまざまなオプションがあります。
1つは、他の回答で提案したように中間ファイルを作成しないことです。これはローカルIOを減らしますが、部分的なアップロードを再開できません。
さらに改善できる他のオプションがあります。
- アーカイブには圧縮を使用します。 GZipは古典的ですが、少し遅いです。 LZ4は最近非常に広く使用されており、非常に高速であり、まだ適切な圧縮率
tar
と説明を提供します。 ZSTDはLZ4ほど高速ではありませんが、短い時間でGZipに似た圧縮率を達成します。選択に関係なく、送信される総データ量が大幅に減少する可能性が高くなります。 cpio
代わりに使用を検討してくださいtar
。tar
正確に省スペースのアーカイブ形式ではありません。これ通常それほど重要ではありませんが、数百万の非常に小さなファイルを処理する場合、オーバーヘッドは実際にはかなり重要です。cpio
それでもかなりの量のオーバーヘッドがありますが、tar
実用的ではないため、理論的にはcpio
ここで使用すると、転送されるデータ量が大幅に削減されます。- 各ファイルのサブセットを含む複数のアーカイブを作成し(たとえば、各アーカイブに最大100,000ファイル)、アーカイブを並列にアップロードすることを検討してください。ソースシステムが高速インターネット接続と比較的高速なストレージを持っていると仮定すると、ローカルIOをより効果的に並列化できるため(そしてAWSも最終的にそれを並列化できるため)、大規模なアーカイブをアップロードするよりも(ほぼ確実に) ) より高速です。ここで、「最適」サイズは通常、マルチパートアップロードを使用する必要がないほど小さくなります。これにより、まだアップロードされていないアーカイブをアップロードするだけで、ローカルで中間ファイルの作成をスキップしても部分的なアップロードを再開するのに役立ちます。
答え4
私はマルチスレッドをたくさん使うためにrcloneを使っています。サーバーとS3の間で同様の操作を行いました。