多数の小さなファイル(合計1TB)を圧縮および転送するときのメモリの問題


15

500万個のファイルがあり、約1 TBのストレージスペースを占有しています。これらのファイルを第三者に転送する必要があります。

これを行う最良の方法は何ですか?.tar.gzを使用してサイズを縮小しようとしましたが、コンピューターに8GBのRAMがあるにもかかわらず、「システムメモリ不足」エラーが発生します。

ファイルをカタツムリメールで送信するのに最適なソリューションはありますか?


9
.tar.gz結果の圧縮ファイルの作成またはコピーに問題がありますか?いずれにせよ、ファイルが大きいからといって、どちらの操作もより多くのメモリを消費するわけではないため、何かがおかしいです。つまり、両方の操作がストリーミングである必要があります。どのコマンドが失敗したかについての詳細情報を含めてください。
セラダ

1
あなたとサードパーティはどれだけの帯域幅を利用できますか?素朴なrsyncを使用すると、郵便料金を節約できます。しかし、rsyncはファイルリストをメモリ内に構築しようとし、list(5e6ファイル)> 8 GBの場合、「500万」ファイルがどのように機能するかわかりません。そしてもちろん、遅くなります。
カルビンリー

2
@oshirowanen ファイルリストを計算するのに大量のメモリを消費するべきではないと思います。なぜなら、ファイルをリストするたびにファイルをtarアーカイブするだけで、メモリにリストを作成することは絶対にないからです。しかし、もう一度、使用している正確なコマンドを表示してください。また、すべてのファイルが同じディレクトリにあるか、ディレクトリ構造が非常に深いですか?
セラダ

3
はい、GUIプログラムは、スケーラビリティや堅牢性などの目標をあまり重要視せずに作成されることがよくあります。それがGUIラッパー/フロントエンドのせいだとしても、私は驚かないでしょう。コマンドラインを使用してファイルを作成すると、うまく機能することがわかります。
セラダ

3
1 Mバイトのブロードバンド接続で1 TBのデータを転送するには、少なくとも22時間かかります。そのため、どの程度の圧縮を期待するかによって、実際には、カタツムリメールがより高速なオプションになる可能性があります。
ダン

回答:


27

コメントで提供される追加情報は、OPが.tar.gzファイルを作成するためにGUIメソッドを使用していることを明らかにしています。

GUIソフトウェアには、同等のコマンドライン同等のソフトウェアよりも多くの肥大化が含まれている場合があります。GUIソフトウェアがメモリ内のすべてのファイル名のリストを収集しようとしても驚かないでしょう。アーカイブを作成するためにこれを行う必要はありません。専用のツールtarおよびgzipは、ストリーミング入出力で動作するように明確に設計されています。つまり、メモリよりもはるかに大きい入出力を処理できます。

GUIプログラムを回避する場合、次のtarような完全に通常の日常的な呼び出しを使用して、このアーカイブを生成する可能性が最も高くなります。

tar czf foo.tar.gz foo

どこfooのすべてのあなたの500万ファイルを含むディレクトリです。

この質問に対する他の回答tarは、結果を複数の部分に分割したい場合などに試すいくつかの追加の代替コマンドを提供します...


15

「5百万」ファイル、合計1 TB その場合、ファイルは非常に小さくなければなりません。私は単に試してみrsyncます:

rsync -alPEmivvz /source/dir remote.host.tld:/base/dir

あなたがそれを持っていない場合-またはあなたのユースケースが使用することを許可していない場合rsync、私は少なくとも7zあなたのデータで動作するかどうかを確認します。そうではないかもしれませんが、まだ試してみる価値があると思います。

7z a archive.7z /source/dir

または7z、少なくとも.tar.xzアーカイブの作成に慣れていない場合:

tar cJv archive.tar.xz /source/dir

(古いバージョンのtar.tar.xzアーカイブを作成しませんが.tar.lzmaJスイッチを使用する場合はアーカイブを作成することに注意してください。まだ古いバージョンのでもtarJフラグを完全にはサポートしていません。)


GUIプログラムを使用してこれらのファイルを作成しているので、コマンドラインインターフェイスを使用すると少し不快に感じると思います。

コマンドラインインターフェイスからのアーカイブの作成、管理、抽出を容易にするために、と呼ばれる小さなユーティリティがありますatool。それは私が見た事実上すべての一般的なディストリビューションで利用可能であり、絶望的に曖昧なものでない限り、私がつまずいたすべての単一のアーカイブのほとんどで動作します。

ディストリビューションにatoolリポジトリがあるかどうかを確認するか、職場環境にある場合は管理者にインストールを依頼してください。

atool 自身に多数のシンボリックリンクをインストールするため、パックとアンパックが簡単になります。

apack archive.tar.xz <files and/or directories>

アーカイブを作成します。

aunpack archive.7z

アーカイブを展開します。

als archive.rar

ファイルの内容をリストします。

作成されるアーカイブの種類はatool、コマンドラインのアーカイブのファイル名拡張子によって識別されます。


4
ここで使用する利点rsyncは、接続が切れた場合(いつ)、中断rsyncしたところから再開できることです。
ロアイマ

2
ファイルは平均200 KBです。それだけではありません。
ネイト・エルドリッジ

4
@NateEldredge私は通常、1GBを超えるという意味で大きいと思います。通常、小さいサイズは1 MB未満です。とても小さい。
PythonNut

8

25:1を超える圧縮を行うことができない限り、サードパーティと交換できるハードウェアテープ形式を使用しない限り、これを圧縮してスネイルメールを送信しても何も得られません。

最大の一般的なストレージはブルーレイであり、およそ40Gbになります。データを25から1に圧縮する必要があります。サードパーティがDVDのみを持っている場合、125:1(大体)が必要です。

これらの圧縮数を一致させることができない場合は、通常のディスクを使用し、サードパーティにメールをコピーして送ります。その場合、圧縮が必要な1Tbドライブよりも小さいものを出荷するのは狂気です。

ネットワーク上でファイルをコピーするためにssh -C(標準圧縮)またはできれば圧縮と比較するだけでよく、事前rsyncに圧縮してtarする必要はありません。1Tbはネット上を移動することは不可能ではありませんが、しばらく時間がかかります。


5
+1:「高速道路を疾走するテープでいっぱいのステーションワゴンの帯域幅を過小評価しないでください」(Andrew S. Tanenbaum)。参照en.wikipedia.org/wiki/Sneakernet
オリヴィエ・デュラック

@OlivierDulacボーイング747とCDROMでいっぱいのボックスで同様の構造を見たことがありますが、それでどんなスループットが得られるかは驚くべきことです。
アントン

私はピジンがロングショットでISPを打ち負かすのが大好きです。ウィキペディアのページの例をご覧ください^^
オリビエデュラック

6

トレントを検討しましたか?ピアツーピアは、インターネット経由の転送に最適なオプションです。

  • 少なくとも他のインターネット転送と同じ速度:アップロード速度によって転送速度が決まります
  • データ破損なし
  • 最初に転送するファイルを選択します
  • 追加のローカル/クラウドストレージスペースは不要
  • 自由

どのOSを使用しているかはわかりませんが、tar.gz圧縮については、GNU / Linuxに似たOSを使用していると仮定します。そのためにTransmissionをお勧めします。これは、MacおよびLinuxで実行されるオープンソースのトレントソフトウェアです。開発者がサポートしているすべてのGUIクライアントにネイティブにするように努力しているので、クロスプラットフォーム言語がありません。

この方法と圧縮を組み合わせることもできますが、転送の一部に優先順位を付けることができなくなります。


トレントソフトウェアには、おそらくGUIソフトウェアの圧縮と同じ問題があります。ファイル名をメモリなどに保存します。また、トレントファイルはファイルのメタデータを保存する必要があります。500万のファイル名をトレントファイルにパックする必要があります。
アエシュK

@AyeshK確かに、これはトレントを追加/作成するとき、またはチェックサムをチェックするときのパフォーマンスに影響します。それでも、これは大量のデータを転送するための最も安定したソリューションだと思います。
LaX

トレントフリークによると、これまでに共有された最大のトレントは〜800GBです。ほとんどのファイルに約33Kのファイルが含まれる単一のトレントファイル。しかし、500万個のファイル...わかりません。
アエシュK

3

7zが私の選択です。アーカイブの自動分割を可能にし、マルチスレッド圧縮をサポートします。いいえ、xzそうではありません、ヘルプメッセージの内容にかかわらず。で試してください:

7za a -v100m -m0=lzma2 -mx=9 -ms=on -mmt=$THREADS archive.7z directory/

出力は100MBブロックに分割されます(-vスイッチで変更します)。

唯一の本当の欠点は、7zがUNIXメタデータ(アクセス許可や所有者など)を保持しないことです。必要な場合は、代わりにtar出力をパイプして7zaください(man 7zaいくつかの例を参照してください)。


1
The only real downsideしかし、なんとデメリット!
njzk2

@ njzk2実際にはそれはシナリオに依存します。たとえば、バックアップイメージまたはデータベースダンプを送信する場合、おそらくアクセス許可についてはあまり気にしません。
ステファノサンフィリッポ

split.tar.gzファイルで使用でき、メタデータを保持できる場合、7zを分割に使用する意味はあまりありません。
njzk2

@ njzk2 分割します。主に、LZMA2によるマルチスレッド圧縮を備えています。私が知っている他のunixユーティリティはそれをサポートしていません。7zには、非ソリッド圧縮モードもあります。これは、特定のファイルにのみアクセスする必要がある場合に大きな前進tarです。
ステファノサンフィリッポ


3

フォルダーを右クリックし、「アーカイブの作成」をクリックして、.tar.gzオプションを選択しました。ディレクトリ構造は深く、500,000を超えるディレクトリ

うん、それをパッケージ化するために幸運を祈ります。また、GUIツールは同じボリュームでこれを実行しようとします。つまり、a)別の1Tbの空きスペースが必要であり、b)1つのファイルを読み取ってアーカイブに追加するというヘッドスラッシングは、ドライブにとってあまり健全ではないことを意味します。

次の2つの可能性があります。

1)コンピューターからサードパーティへのrsync。どちらか一方には、頻繁に変更されないグローバルIPアドレスが必要になります。rsync の大きな利点は、何らかの理由で中断された場合、中断したところから再開できることです。1Tb tarballのコピーは成功するか失敗するかのいずれかです

2)1Tb外付けドライブを購入し、そこにコピーして、ドライブを配送します。待ち時間は長いですが、到着したときの帯域幅は本当に良いです。初期バックアップのためにこれにさまざまなオンラインバックアップサービス。



1

次のようなものを使用することをお勧めします。

tar -c -L 104857600 -f file1.tar -f file2.tar -f file3.tar -f file4.tar -f file5.tar -f file6.tar -f file7.tar -f file8.tar -f file9.tar -f file10.tar 
gzip file*.tar

最大で100GBのサイズのファイルが10個作成されます。しかし、tarは読み取り/書き込みをストリーミングするため、「OOM」の問題に答えることはできません。そのため、ボトルネックは明らかにgzipです。


0

どのようにそのことについて:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find 検索はディレクトリツリーをリストします
  • tar -T - stdinからリストを読み取ります
  • -czf -アーカイブを作成してstdoutにz書き込み、ストリームをgzipします
  • ssh remotehost 使用してリモートホストにログインする ssh
  • cd /target/dir/ ターゲットディレクトリに変更します
  • tar xzf - stdinから着信ストリームを抽出します

素敵な小さなスニペット。私はここで彼の必要性は主に圧縮機能であると思いますが、目的は「友人に転送する」ことであるため
-mveroone

ネットワークの停止(24時間ごとに接続を切断するISPがまだあります)またはその他の理由により、1 TBの転送中に接続が中断した場合、アーカイブを完全に作成しないと損傷しません。
ジョナスシェーファー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.