2016-07-14 17 views
4

文字列を含むリストからxバイトのデータを読み取る方法を見つける必要があります。リストの各項目は〜36MBです。リストの各項目を実行する必要がありますが、一度にその項目の約1KBを取得するだけです。Pythonで文字列のリストの一部だけを読む方法

基本的に、それは次のようになります。

for item in list: 
    #grab part of item 
    #do something with that part 
    #Move onto next part, until you've gone through the whole item 

私の現在のコード(作品のようなものではなく、遅くて非効率的であると思われる)などである。

for character in bucket: 
    print character 
    packet = "".join(character) 
    if(len(packet.encode("utf8")) >= packetSizeBytes): 
     print "Bytes: " + str(len(packet.encode("utf8"))) 
     return packet 

場合、私は思ったんだけど文字列の場合はf.read(bufSize)のようなものが存在します。私ははるかに小さい(より管理しやすいチャンク)に非常に大きなファイル(数GB)からデータを読んでいる

:それは、関連するのですが、より多くのコンテキストのために、これは私がやっているであれば

わかりません。私はf.read(chunkSize)を使用してファイルをチャンクし、それらをbucketsとして保存します。しかし、それらのバケットでさえも、最終的にデータを処理する必要があるためにはまだ大きすぎますので、一度にバケットの一部しか取得しません。

元々、私はバケツの全体をバイパスして、私の目的のために十分小さかったチャンクにファイルをチャンクしました。しかし、これにより、何千もの時間をかけてファイルをチャンクしなければならなくなりました。バケツをキューに入れてバケツで何かをしている間に、他の人から読むことができるようにすることが今の希望です。このような音が混乱する場合は、私に知らせてください。私は明確にしようとします。あなたはstr年代(またはbyte「パイソン3における複数可)を使用している場合

おかげ

+0

チャンクを保存する理由... f.read(chunkSize)のようにデータの各ビットを処理するだけでなく、完了したらそれを放棄するのはなぜですか? –

+0

これは私が元々やっていたものですが、はるかに小さいチャンクでもあります。データを扱う際には、データの一部を「プリロード」するよりも時間がかかるように見えて、別のデータを読みながらデータを処理できるようになりました。基本的に私はデータでバッファをダブルバッファリングしようとしています – Swoldier

+0

@Swoldierタイミングとプロファイリングによる遅さの印象を確認しましたか? :) –

答えて

2

は、各文字がバイトなので、f.read(5)f[:5]と同じです。あなたは、リスト内のすべての文字列からわずか最初の5つのバイトをしたい場合は、

[s[:5] for s in buckets] 

を行う。しかし、これはすべてのこれらの文字列のコピーを作っていることに注意してください可能性があります。多数の仲介リストを作成し、別のスレッドにそのデータを送信して処理し、ファイルを読み続けるのではなく、読んでいるときに必要なデータだけを取るほうが、メモリー効率が高くなります。

import threading 

def worker(chunk): 
    # do stuff with chunk 
    ... 

def main(): 
    with open('file', 'r') as f: 
     bucket = f.read(500) 
     while bucket: 
      chunk = bucket[:5] 
      thread = threading.Thread(target=worker, args=(chunk,)) 
      thread.start() 
      bucket = f.read(500) 
0

入力リストに影響を与えたい場合は、この速度を確認してください。

l = [] # Your list 
x = 0 
processed = 0 
while processed!=len(l): 
    bts = l[x][:1024] 
    l[x] = l[x][1024:] 
    # Do something with bts 
    if not l[x]: processed += 1 
    x += 1 
    if x==len(l): x = 0 

この方法では、一部のサーバーがバッファリングに使用しますが、特定の文字列サイズ後の文字列操作は遅くなります。ですから、リストのリストを作成時点ですでに1つのKに切り捨てておくのが最善です。

関連する問題