5Gファイルデータから特定のデータを検索する21の機能(メモリはわずか50M)

5Gファイルデータから特定のデータを検索する21の機能(メモリはわずか50M)

1ステップ
1)ファイルを分割します。現時点では、5Gのログファイルがあります。ファイルデータの整合性を維持するために、行分割を使用します。最初に1Gファイルを生成し、次に5回ループして5Gファイルを取得します。4kを使用して5Gファイルを直接生成することもできますが、CPUの速度が非常に遅くなり、ごみ箱のコンピューターが動かなくなります。5Gを生成するためのファイルを以下に示しますが、最初に1Gを生成するには、小さな4kファイルを使用する必要があります。コードは同じです。回数を変更するだけです。

#!/bin/bash

BASE_LOG_PATH=~/MyLinux/BigFileSplit/message.log ##1G文件
RES_LOG_PATH=~/MyLinux/BigFileSplit/result.log   ##目标文件


for i in `seq 1 5`; do
    cat $BASE_LOG_PATH >> $RES_LOG_PATH 
    echo "www.example.com|10.32.185.95|-[28/Oct/2014:12:34:39 +0800]|" >> $RES_LOG_PATH    ##目标查找数据
done

2)生成後、ファイルの合計行数と対応するサイズを確認します。wc -lresult.logおよびll-h。ファイルの行数は182,273,288行で合計1億行を超え、サイズは約4.6Gで、ここでは5Gと見なされます。次に、それらを使用して、各10Mの小さなファイルを分割するために必要な行数を見つけます。つまり、
5G = 182273288です。ここでは、10Mの小さなファイルに分割され、5Gが変換されると想定しています。
(10x102.4x5)M = 182273288; 512で割った後、10Mは約356002行になります。

2)split -l 356002 result.log test //ファイルの分割
ll-h //各ファイルが約92Mであることがわかります。

3)ターゲットデータを見つけるためのスクリプトを記述します。

#!/bin/bash
name=~/MyLinux/BigFileSplit/test_   ##用于字符串拼接
for i in `seq 1 512`; do
ename=$name$i                      ##字符串与数字拼接成文件名
cat -n $ename |grep "www.example.com"
done

おすすめ

転載: blog.csdn.net/weixin_44517656/article/details/107932554