にいくつかの小さな、確率論的な書き込みに大きなファイルを分割することは少し恥ずかしいですが、私はむしろ、単純な(少なくともそれがあるべき)タスクに難易度のビットを持つ:私が持っていると思います複数のファイル
大規模なテキストファイル(数GB)を使用し、より小さな部分に分割するスクリプト。しかし、このパーティショニングは、行の順序ではなく、一致する文字列パターンに基づいて行われることになっているため、各行/エントリは開始文字に基づいて分類されるはずです。
- 辞書にカテゴリを定義{キー:パターン}
- 機能
- を分類/マッチングを定義する入力ファイルを開き、エントリ
- がそれぞれを分類反復するために始めるので、アルゴリズムは次のようになります適切なファイルへのアウトエントリ
- 書き込みエントリ
私がいる問題は、具体的には、出力ファイルである:
事前に宣言しますか?カテゴリの数はインスタンスごとに変更される可能性があるため、オープンするファイルの数は技術的に分かりません。また、各カテゴリが入力データに表示されるという保証はないため、内容のないファイルを作成するのは愚かであろう。
私がdictのカテゴリを反復処理して多数のファイルを開くと、どのファイルがどのキーに対応しているかをどのように追跡するのですか?つまり、
dict2 {key : file}
というのは残酷な気持ちで、特にあまり好きではないと感じています。ファイルを前もって開いておかないと、ファイルに書き込む必要があるたびに新しいioチャンネルを開いたり閉じたりしても、私はかなりのオーバーヘッドがあると思います。
必要なファイルだけを開くと別の合併症は以下の通りです。私がスクリプトを実行するたびに、結果のファイルを上書きしたい。しかし、私がメインループ内でファイルへのアクセス権を持っていれば、追加するファイルを開く必要があります。以下は
私がこれまで持っていたテストコードです:
from itertools import islice
import random, sys, os
cats = {
"key1" : "<some pattern>",
"key2" : "<some other pattern>",
"key3" : "<yet another pattern>"}
def delta(x, s):
return sum([int(c0 != c1) for c0,c1 in zip(x,s)])
def categorize_str(x, cats):
d = {cat : delta(x,tag) for cat,tag in cats.items()}
return min(d, key=d.get)
def main():
file = sys.argv[1]
nseq = None if len(sys.argv) < 3 else int(sys.argv[2])
path = os.path.dirname(file)
base = os.path.basename(file))
(name,ext) = os.path.splitext(base)
for k in cats.keys(): # <----
outfile = os.path.join(path, ''.join([name, "_", k, ext])
# what do I do with outfile now???
read = ... # library call to that opens input file and returns an iterator
for rec in islice(read,nseq):
c = categorize_str(rec, cats)
# depending on c, write to one of the "outfile"s
if __name__ == "__main__":
main()