2016-08-03 5 views
0

にいくつかの小さな、確率論的な書き込みに大きなファイルを分割することは少し恥ずかしいですが、私はむしろ、単純な(少なくともそれがあるべき)タスクに難易度のビットを持つ:私が持っていると思います複数のファイル

大規模なテキストファイル(数GB)を使用し、より小さな部分に分割するスクリプト。しかし、このパーティショニングは、行の順序ではなく、一致する文字列パターンに基づいて行われることになっているため、各行/エントリは開始文字に基づいて分類されるはずです。

  1. 辞書にカテゴリを定義{キー:パターン}
  2. 機能
  3. を分類/マッチングを定義する入力ファイルを開き、エントリ
  4. がそれぞれを分類反復するために始めるので、アルゴリズムは次のようになります適切なファイルへのアウトエントリ
  5. 書き込みエントリ

私がいる問題は、具体的には、出力ファイルである:

  • 事前に宣言しますか?カテゴリの数はインスタンスごとに変更される可能性があるため、オープンするファイルの数は技術的に分かりません。また、各カテゴリが入力データに表示されるという保証はないため、内容のないファイルを作成するのは愚かであろう。

    • 私が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() 

答えて

0

アイデア:という名前のクラスを定義し、言う、パターン。ここにはいくつかのメンバ変数があります:一つはあなたがすでに持っている"<some pattern>"です。もう一つはファイル名です。 3番目は、そのファイルの次のopen()呼び出しに使用するモードです。モードは初めて(新しいファイルを作成する) "w"になり、コードはそれを "w +"に変更して、後で書き込みを追加します。このクラスのインスタンスは値として "cats"辞書に入ります。これは、複数の辞書を使用することに反対します.1つのカテゴリを処理するために必要なすべての情報は、1つのオブジェクトに保持されます。空のファイルを作成しないようにすることもできます。

多分、OSは、いくつかのファイルに小さな追加をたくさんするという問題を十分に処理するでしょう。それがパフォーマンスのボトルネックになっている場合は、もっと多くの作業が必要になります(リストにいくつかの更新をキャッシュしてから、一度に書き出すこともできます)。

関連する問題