2017-02-01 1 views
2

私はリストに保存する必要があるテキストファイルを持っています。ファイルの内容をリストに入れますか?

FILE:

1 1 
4 2 
9 10 

私は、オブジェクトのリストを持っていると思います。 L = [obj obj obj]

CODE:

def putInList(pathToFile): 
    myList = [] 
    with open(pathToFile) as f: 
     for line in f: 
      s = line.split() 
      x, y = [int(v) for v in s] 
      jemand = Mensch(x, y) 
      myList.append(jemand) 
    return myList 

これは正常に動作します! 私の問題は私がアクセスしたことですディスクメモリ行の回数!

このサンプルは人工的です。私ははるかに大きなファイルで作業します。だから私は~100MB.txtファイルに入れてスライサーを書いた。だから私はlistdisk memory万回アクセスすることなくそれらを入れたいと思っています。

は、検索とStackOverflowの上の他の質問の後、私は、コードのこの部分が見つかりました:

a = open(fileToPath, 'r') 
L = [line for line in a.readlines()] 

をしかし、私はリストを解析する方法に見当もつかない?

+1

あなたの仮定は間違っています、あなたは$ lines回ディスクメモリにアクセスしません。バッファリングはそれを扱います。心配しないで、数ギガバイトのファイルを繰り返しました。 – L3viathan

+0

@ L3viathan、100MBファイルの解析では15分かかるだけです!それは正常に聞こえるか? –

+0

私はあなたの 'Mensch'クラスが何をしているのか分からないので、私はボトルネックが何であるか正確にはわかりません。しかし、ファイルを分割して分割しても、最終的にすべてのものをRAMに入れておけば役に立ちません。他の提案については、私の答えを参照してください。 – L3viathan

答えて

2

あなたの前提は間違っています。$ lines回のディスクメモリにはアクセスしません。バッファリングはそれを扱います。

私はいくつかの推奨事項を作ることができます。ライン分割ロジックは、必要以上に複雑です。明確に、やっている(私の意見では)それを作る一つの方法:あなたが不直後に破棄されたリストを作成しない

x, y = map(int, line.split()) 

その方法。

後でmyListを反復処理し、一度だけそれを行う場合は、あなたが完全リストを削除し、代わりに発電機の機能を使用することができます。

def putInList(pathToFile): 
    with open(pathToFile) as f: 
     for line in f: 
      x, y = map(int, line.split()) 
      yield Mensch(x, y) 

あなたがかもしれませんがあなたは、その後、for mensch in putInList(filename):を使用して、それを反復処理することができますその場合は関数の名前を変更します。あなたはまだリストが必要な場合、私はそれに関係なく、myList = list(putInList(filename))を使用してリストを取得します。

+0

私は現在menschで何もしていません..オブジェクトのリストに '100MB'ファイルを解析して保存するだけで、なぜそれが15〜20分かかります〜。 –

+0

10MBの場合、3分から2:30になりましたので、スピードアップはわずかです。私は今 'map(int、line.split())'を使用します。しかし、私はちょうどどれくらいの時間がかかるかわかりません... –

+0

2行の数字が2行で平均して1行に6バイト、すなわち約1700万のオブジェクトを意味します - これはPythonオブジェクトのオーバーヘッドを含みますRAMのより多くのデータに変換される可能性があります。あなたの仕様に合った最もシンプルな 'Mensch'クラスを書いています。オブジェクトは32バイトのRAMを必要とします。それはすでに500 MB以上の方法です。 – L3viathan

0

readLines()returns a list of the linesデフォルトでは、だから私はあなたがすべきだと思います:

def putInList(pathToFile): 
    myList = [] 
    fileHandle = open(pathToFile, "r") 
    lines = fileHandle.readLines() 
    for line in lines: 
     values = line.split() 
     x, y = [int(v) for v in values] 
     jemand = Mensch(x, y) 
     myList.append(jemand) 
    return myList 
関連する問題