ホームページ  >  に質問  >  本文

python 如何实现并行查找关键字所在的行?

我有几十万个关键字放在文件4.txt中,想提取文件3.txt中含有关键字的行,保存到文件5.txt中.
文件3有200万行,我使用下面的代码可以实现我的要求,但是非常慢,一个下午还没运行完,谁有快一点的方法?
使用并行改如何改造呢?我看到这里有个并行的帖子,,与我的不同的事,我要同时读以及查询同一个文件,上述链接可以并行操作多个文件。

with open('3.txt', 'r') as f3, open('4.txt', 'r') as f4, open('result.txt', 'w') as f5:
    a = [line.strip() for line in f4.readlines()]
    for li in f3.readlines():
        new_line = li.strip().split()[1][:-2]
        for i in a:
            if i in new_line:
                f5.writelines(li)
高洛峰高洛峰2742日前1084

全員に返信(3)返信します

  • 阿神

    阿神2017-04-17 17:47:22

    実際のファイルがないため、100% の保証はできませんが、コードの効率を向上させるための提案がいくつかあります。

    (おそらく、改善されたコードでは並列ソリューションがまったく必要ないことがわかるでしょう)


    まず第一に、大きな問題は readlines() です。このメソッドはファイル オブジェクト内のすべての行を一度に読み取ります。これは明らかに効率が悪く、数十万の行が存在します。一気に全部読まないといけない、とても怖いです。

    詳細な分析と議論については、ファイルに対して readlines() を決して呼び出さないを参照してください

    (記事内のこの段落はほとんど警告と見なすことができます)

    StackOverflow などの場所には、readlines メソッドに関する何百もの質問がありますが、どの場合でも答えは同じです。
    「私のコードは開始するまでに永遠に時間がかかりますが、かなり高速です」 "
    それは、readlines を呼び出しているからです.
    "私のコードは、単なるループであるにもかかわらず、入力のサイズに関してリニアよりも悪いようです。 "
    それは、readlines を呼び出しているからです。
    「メモリ不足のため、私のコードは巨大なファイルを処理できません。」
    それは、あなたが呼び出しているからですreadlines.

    結論は次のとおりです。 readlines が使用されている場所はすべて に変更することをお勧めします。

    例:

    リーリー

    を次のように変更する必要があります:

    リーリー

    直感的には、効率が大幅に向上します。


    2 番目に、リストを使用してキーワードを検索しましたが、これも非常に非効率的です:

    リーリー

    new_line にキーワード i があるかどうかを確認するために、キーワード リスト全体 a を参照しました。これは一般的な状況では問題ないかもしれませんが、数十万のキーワード比較の場合は、 a の各行を訪問すると、かなりの時間の無駄が発生します。a に x 個のキーワード、f3 に y 行、各行に z 個の単語があるとします。ここで費やされる時間は x*y*z (状況によって異なります)。ファイル内の行数から考えると、この桁数は非常に驚異的です)。

    dictionaryset など、検索にハッシュを使用するコンテナーを単純に使用する方が良いでしょう。


    最後の部分は検索についてです:

    リーリー

    これがよくわかりません。new_line は部分文字列のようですが、この文字列を使用してキーワードを比較したいのですか?

    しかし、それはさておき、キーワードを含むnew_lineについては、aに印刷したいキーワードがいくつかあるという意味でない限り、印刷後にnew_lineをループし続けるべきではないようですline 数回。 それ以外の場合、break を追加するとプロセスが高速化される可能性があります。


    コードを次のように変更することをお勧めします。

    リーリー

    私が間違っていた場合は、遠慮なく教えてください。また議論しましょう。直感的には、並列処理を使用しなくても問題は解決されるはずです。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:47:22

    交流オートマトン

    返事
    0
  • 黄舟

    黄舟2017-04-17 17:47:22

    @dokelung の回答に基づいて、わずかに変更を加えれば、基本的に私の要件を満たすことができます。この答えは、 grep -f 4.txt 3.txt > 5.txt を使用する場合とは多少異なります。2 つの結果ファイルの違いを比較しています。

    リーリー

    返事
    0
  • キャンセル返事