2

10GB の RAM がある大きなファイルで文字列 "And" の出現回数を調べるように依頼されました。どうすれば効率的にできますか。私は、それぞれ 100MB のメモリ チャンクでファイルを読み取り、各メモリ チャンクで "And" の合計出現回数を見つけ、文字列 "And" の累積カウントを保持する必要があると答えました。インタビュアーは私の答えに満足せず、コマンド grep が unix でどのように機能するかを教えてくれました。python で似たようなコードを書いてみたのですが、答えがわかりませんでした。この質問への回答をいただければ幸いです。

4

2 に答える 2

5

ファイルを反復処理して、行を返します。この場合、検索文字列に行末文字が含まれていないため簡単です。そのため、一致が行をまたぐことを心配する必要はありません。

with open("file.txt") as fin:
    print sum(line.count('And') for line in fin)

str.count各回線での使用

>>> ヘルプ (str.count)
method_descriptor に関するヘルプ:

カウント(...)
    S.count(sub[, start[, end]]) -> int

    部分文字列 sub の重複しない出現回数を返します
    文字列 S[開始:終了]。オプションの引数 start と end は解釈されます
    スライス表記のように。
于 2013-07-23T05:35:51.217 に答える
4

ジェネレーターを使用すると、大きなファイルにアクセスして処理を行うことができます。

簡単なgrepコマンド、

def command(f):
    def g(filenames, **kwa):
        lines = readfiles(filenames)
        lines = (outline for line in lines for outline in f(line, **kwa))
        # lines = (line for line in lines if line is not None)
        printlines(lines)
    return g

def readfiles(filenames):
    for f in filenames:
        for line in open(f):
            yield line


def printlines(lines):
    for line in lines:
            print line.strip("\n")

@command
def grep(line, pattern):
    if pattern in line:
        yield line


if __name__ == '__main__':
    import sys
    pattern = sys.argv[1]
    filenames = sys.argv[2:]
    grep(filenames, pattern=pattern)
于 2013-07-23T05:30:55.900 に答える