我需要找到一种能够从包含字符串的列表中读取x字节数据的方法。列表中的每个项目大约为36MB。我需要能够遍历列表中的每个项目,但一次只能抓取大约1KB的项目。
基本上它看起来像这样:
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 :(得分:2)
如果您在python 3中使用str
(或byte
),则每个字符都是一个字节,因此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)
答案 1 :(得分: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.