2016-07-14 71 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。但是,即使這些存儲桶對於我最終需要處理的數據來說仍然太大,所以我只想一次抓取部分存儲桶。

本來,我繞過了整個桶的東西,只是將文件分塊成足夠小的塊,用於我的目的。然而,這導致我不得不將文件分塊數十萬次,這有點慢。我現在的希望是能夠讓水桶排隊,這樣當我用一桶水做什麼時,我就可以開始閱讀別人。如果這聽起來令人困惑,讓我知道,我會盡力澄清。

感謝

+0

爲什麼要存儲這些塊...爲什麼不像處理f.read(chunkSize)時那樣處理每一位數據並在完成後丟棄它? –

+0

這就是我最初做的,雖然有更小的塊。處理數據的過程似乎比「預加載」某些數​​據要慢,以便我可以在讀取另一個數據的同時處理一段數據。本質上,我試圖用數據加倍緩衝 – Swoldier

+0

@Swoldier你是否通過計時和分析來驗證你的印象是否緩慢? :) –

回答

2

如果你使用str的(或byte「在Python 3秒),每個字符是一個字節,所以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 

這種方法有些服務器用於緩衝,但在某些字符串大小變慢後的字符串操作。所以最好的辦法是在創建時將列表的列表已經截斷爲一個K.