1

ボックスに非常に大きなログファイル(9GB-修正する必要があることはわかっています)があります。バックアップのためにAmazonS3にアップロードできるように、チャンクに分割する必要があります。S3の最大ファイルサイズは5GBです。そこで、これをいくつかのチャンクに分割してから、それぞれをアップロードしたいと思います。

ここに問題があります。サーバーに空きがあるのは5GBしかないため、単純なUNIX分割を実行することはできません。これが私がやりたいことです:

  1. ログファイルの最初の4GBを取得し、別のファイルに吐き出します(セグメント1と呼びます)。
  2. そのsegment1をs3にアップロードします。
  3. rmsegment1を使用してスペースを解放します。
  4. ログファイルから中央の4GBを取得し、s3にアップロードします。以前と同じようにクリーンアップ
  5. 残りの1GBを取得し、S3にアップロードします。

オフセットで分割するための適切なUNIXコマンドが見つかりません。Splitは同じチャンクでしか処理を行わず、csplitにも必要なものがないようです。何かお勧めはありますか?

4

4 に答える 4

3

1 つの (複雑な) 解決策は、最初に圧縮することです。テキスト形式のログ ファイルは 9G から 5G をはるかに下回りますが、元のログ ファイルを削除すると、9G の空き容量が得られます。

次に、その圧縮ファイルを直接パイプして、splitより多くのディスク領域を使用しないようにします。最終的には、圧縮ファイルとアップロード用の 3 つのファイルができあがります。

それらをアップロードしてから削除し、元のログを解凍します。

=====

より良い解決策は、行数 (たとえば 300 万行) を数え、awk スクリプトを使用して個々の部分を抽出して送信することです。

awk '1,1000000 {print}' biglogfile > bit1
# send and delete bit1

awk '1000001,2000000 {print}' biglogfile > bit2
# send and delete bit2

awk '2000001,3000000 {print}' biglogfile > bit3
# send and delete bit3

次に、反対側で、個別に処理bit1するか、それらを再結合できます。bit3

mv bit1 whole
cat bit2 >>whole ; rm bit2
cat bit3 >>whole ; rm bit3

そしてもちろん、この分割は、Unix の標準的なテキスト処理ツール ( perlpythonawkhead/tailコンボ) で行うことができます。それはあなたが何に慣れているかによって異なります。

于 2009-05-09T02:10:30.707 に答える
2

まず、ログ ファイルを gzip -9 します。

次に、dd を使用する簡単なシェル スクリプトを作成します。

#!/bin/env sh

chunk_size = 2048 * 1048576; #gigs in megabytes
input_file = shift;    

len = `stat '%s' $input_file`
chunks = $(($len/$chunk_size + 1))

for i in {0...$chunks}
do
  dd if=$input_file skip=$i of=$input_file.part count=1 bs=$chunk_size
  scp $input_file.part servername:path/$input_file.part.$i
done

これを頭のてっぺんから落とし込んだだけなので、変更なしで機能するかどうかはわかりませんが、これと非常によく似たものが必要です。

于 2009-05-09T02:13:56.940 に答える
2

dd を使用できます。各ブロックで bs (メモリ バッファー サイズ)、skip (スキップするバッファーの数)、および count (コピーするバッファーの数) を指定する必要があります。

したがって、10Meg のバッファー サイズを使用すると、次のようになります。

# For the first 4Gig
dd if=myfile.log bs=10M skip=0 count=400 of=part1.logbit
<upload part1.logbit and remove it>
# For the second 4Gig
dd if=myfile.log bs=10M skip=400 count=400 of=part2.logbit
...

転送するデータを圧縮すると、次の利点が得られる場合もあります。

dd if=myfile.log bs=10M skip=800 count=400 | gzip -c > part3.logbit.gz

もっとフレンドリーな方法があるかもしれません。

dd にはいくつかの実際の欠点があります。小さなバッファ サイズを使用すると、実行速度が大幅に低下します。ただし、ファイル内でスキップ/シークできるのは bs の倍数だけです。したがって、素数のオフセットからデータの読み取りを開始したい場合は、本当に大変です。とにかく脱線します。

于 2009-05-09T02:14:48.433 に答える
0

Coreutils split は、最後のセクションを除いて、同じサイズの出力セクションを作成します。

split --bytes=4GM bigfile chunks
于 2009-05-09T02:16:23.390 に答える