複数のファイルでのzgrepのパフォーマンスの低下

ハッピー

私が持っている9.8ギガバイト私が持っているGZIPファイルA.gzおよびその他のファイルがある79メガバイト各行のいくつかのテキストを持っていB.TXT。BのテキストをA.gzでgrepして、新しいファイルに書き込みたい。

最初は、このコマンドを使用しました

zgrep -f B.txt A.gz > C.xml

しかし、このコマンドはハングし、非常に長い間空のC.xmlを作成しました。

それからグーグルした後、私はB.txtが巨大であるため、テキストをバッファに保持するときにハングすることを知りました。

だから私はテキストファイルをそれぞれ20000テキストに分割しました

split -l 20000 -a 4 B.txt B

Baaaa、Baaabなどのファイルを作成しました。

次に、各ファイルを繰り返し処理しました

cd B
for f in B*; do
  zgrep -f "$f" ../A.gz >> C.xml
done

それは非常に遅く、まだ実行中です。

これに対するより良いアプローチはありますか?

gzファイルをgunzip圧縮すると、パフォーマンスが向上しますか?

更新

-Fで試してみました

zgrep -F -f "$f" ../A.gz >> C.xml

これは少し速いですが、それでも他のオプションが必要です

私は次のようなxmlを持っています

<root>
   <source>source1</source>
   <Id>123</Id>
   <category>ABC</category>
</root>
<root>
    <source>source2</source>
    <Id>123</Id>
    <category>XYZ</category>
</root>

ここでidは同じ123ですが、カテゴリはABCとXYZで異なります

(入力はABC、DEF、GHI、JKLM、NOPなどの限られたカテゴリのセットです)最初はABCとしてカテゴリを持っているので、カテゴリABCに基づいて、そのID、つまり123を見つけます。これらに属するすべてのIDを書き込み続けます。以下のように、新しいファイル、つまりB.txt(IDのリスト)にカテゴリを入力します

zgrep -E 'ABC|DEF|GHI|JKLM|NOP' A.gz | sed -n 's:.*<Id>\(.*\)</Id>.*:\1:p' | uniq > B.txt

後で、このIDを繰り返し処理して、すべてのxmlをフェッチします。このようにして、ID123に属するカテゴリABCとXYZの両方のxmlタグを取得します。

アノン

79MByteのgrep「文字列」を操作するのは面倒です。B.txt本当に正規表現の行ですか、それとも同じ文字列に固定されていますか?それらが固定文字列である場合、それらはA.gz行全体で同じように表示されますか?非圧縮の何行がの行A.gzと一致すると予想されますB.txtか?

パターンマッチングの提案

の行がB.txt実際には正規表現または行の部分文字列であるA.gz場合、巨大な正規表現を処理するように設計されたHyperScanのようなものを使用せざるを得ない場合がありますディスク容量がある場合は、解凍A.gzしてHyperScanに処理を任せることができます(HyperScanがシェルを検索しているときに、シェルをその場で解凍することもできます)。試すもう1つの方法は、ripgrepです。

フルラインマッチングの提案

で固定の全行文字列を処理していB.txtて、圧縮さA.gzれていないものに比較的小さい(たとえば、100MB程度)一致する行が含まれている場合は、前処理するプログラムを作成する方がよい場合がありますA.gz

  • の各行をハッシュB.txtして、ハッシュを覚えておくことができます
  • 次に、非圧縮A.gzハッシュの行が以前のハッシュと同じものになっているかどうかを確認します。もしそうなら、あなたC.txtはさらなる処理の準備ができている行を(例えばに印刷します
  • ここで、最終パスを実行します。ここでB.txtは、各行が入っているかどうかをより厳密にチェックしますC.txt(または、その逆-どのファイルが小さかったかによって異なります)。

初期近似フィルタリングを行うためのいくつかのコードは次のようになります。

# Do a quick APPROXIMATE filter of lines in FILENEEDLES that are also in
# FILEHAYSTACK
import sys

def main():
    if len(sys.argv) < 2:
        print("usage: %s FILENEEDLES FILEHAYSTACK" % sys.argv[0])
        exit(1)

    first_filename = sys.argv[1]
    second_filename = sys.argv[2]

    line_hashes = set()

    with open(first_filename, "r") as f:
        for line in f:
            line_hashes.add(hash(line))

    with open(second_filename, "r") as f:
        for line in f:
            if hash(line) in line_hashes:
                sys.stdout.write(line)

if __name__ == "__main__":
    main()

例えば:

$ echo -e '1\n2\n3' > B.txt
$ echo -e '2\n3\n4\5' | gzip > A.gz
$ ./approxfilter.py B.txt <(gzip -dc A.gz) > candidates.txt
$ cat candidates.txt
2
3

ここで、candidates.txtをチェックして、出力される行がそれらの行と完全に一致するかどうかを確認する必要がありますB.txt(ただし、これはより小さく、はるかに簡単な問題であり、候補行の数が「少ない」場合は、上記のプログラムを変更してすべてを実行することもできます。 「そして、メモリに保持できる範囲内で十分です)。(質問者は後でコメントで、完全な行の長さの文字列では機能しないため、このアプローチは機能しないことを明らかにしました)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

CythonでのC ++関数のパフォーマンスの低下

分類Dev

大きなサイズのパフォーマンス低下で複数のアイコンを描画すると

分類Dev

アレイでのOpenMPのパフォーマンス低下

分類Dev

複数のレコードの更新-パフォーマンスの低下

分類Dev

BCryptのパフォーマンス低下

分類Dev

SQL Server 2012 FileTableファイル作成時のパフォーマンスの低下(Lucene.NETの統合)

分類Dev

複数のファイルでのgrepとzgrepの終了ステータスの違い

分類Dev

Win10でのVirtualBoxのパフォーマンスの低下

分類Dev

MySQLでのUNIONALLのパフォーマンスの低下

分類Dev

カーソルのパフォーマンス低下の問題

分類Dev

numpyでのベクトル化後のパフォーマンスの低下

分類Dev

並行キューでのパフォーマンスの低下

分類Dev

Java-大きな文字列で複数行の正規表現のパフォーマンスが低下する

分類Dev

Linuxでのmemcpyパフォーマンスの低下

分類Dev

Java演習でのパフォーマンスの低下

分類Dev

Keras:ImageDataGeneratorでのパフォーマンスの低下

分類Dev

左結合でのCTEのパフォーマンス低下

分類Dev

一連のgzファイル内の複数のパイプシンボルのzgrep

分類Dev

並列ループパフォーマンスの低下

分類Dev

ループパフォーマンスの低下

分類Dev

多くのファイルのglusterパフォーマンス

分類Dev

withStylesのマテリアルUIの潜在的なパフォーマンスの低下

分類Dev

多数の(小さな)ファイルがファイルシステムのパフォーマンスを低下させる可能性はありますか?

分類Dev

Windowsでのlocaltime_s()のマルチスレッドパフォーマンスの低下の回避策

分類Dev

Windowsでのlocaltime_s()のマルチスレッドパフォーマンスの低下の回避策

分類Dev

最小限のxsessionでのChromeのパフォーマンスの低下

分類Dev

logstashのファイルプラグイン内の複数のフォルダーへのパス

分類Dev

CPUパフォーマンスの非常に突然の80%の低下

分類Dev

IBMiでの物理ファイル(表)のパフォーマンス

Related 関連記事

  1. 1

    CythonでのC ++関数のパフォーマンスの低下

  2. 2

    大きなサイズのパフォーマンス低下で複数のアイコンを描画すると

  3. 3

    アレイでのOpenMPのパフォーマンス低下

  4. 4

    複数のレコードの更新-パフォーマンスの低下

  5. 5

    BCryptのパフォーマンス低下

  6. 6

    SQL Server 2012 FileTableファイル作成時のパフォーマンスの低下(Lucene.NETの統合)

  7. 7

    複数のファイルでのgrepとzgrepの終了ステータスの違い

  8. 8

    Win10でのVirtualBoxのパフォーマンスの低下

  9. 9

    MySQLでのUNIONALLのパフォーマンスの低下

  10. 10

    カーソルのパフォーマンス低下の問題

  11. 11

    numpyでのベクトル化後のパフォーマンスの低下

  12. 12

    並行キューでのパフォーマンスの低下

  13. 13

    Java-大きな文字列で複数行の正規表現のパフォーマンスが低下する

  14. 14

    Linuxでのmemcpyパフォーマンスの低下

  15. 15

    Java演習でのパフォーマンスの低下

  16. 16

    Keras:ImageDataGeneratorでのパフォーマンスの低下

  17. 17

    左結合でのCTEのパフォーマンス低下

  18. 18

    一連のgzファイル内の複数のパイプシンボルのzgrep

  19. 19

    並列ループパフォーマンスの低下

  20. 20

    ループパフォーマンスの低下

  21. 21

    多くのファイルのglusterパフォーマンス

  22. 22

    withStylesのマテリアルUIの潜在的なパフォーマンスの低下

  23. 23

    多数の(小さな)ファイルがファイルシステムのパフォーマンスを低下させる可能性はありますか?

  24. 24

    Windowsでのlocaltime_s()のマルチスレッドパフォーマンスの低下の回避策

  25. 25

    Windowsでのlocaltime_s()のマルチスレッドパフォーマンスの低下の回避策

  26. 26

    最小限のxsessionでのChromeのパフォーマンスの低下

  27. 27

    logstashのファイルプラグイン内の複数のフォルダーへのパス

  28. 28

    CPUパフォーマンスの非常に突然の80%の低下

  29. 29

    IBMiでの物理ファイル(表)のパフォーマンス

ホットタグ

アーカイブ