我需要找到一种方法,能够从包含字符串的列表中读取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)对文件进行分块,然后将它们存储为存储桶但是,即使这些存储桶仍然太大而不能用于我最终需要处理的数据,所以我想一次只抓取部分存储桶.
最初,我绕过了整个桶的东西,只是把文件分成了足够小的块,以满足我的需要.然而,这导致我不得不将文件数十万次,这有点慢.我现在的希望是能够排队等待,所以当我用一个桶做某事时,我可以开始从别人那里读书.如果任何一个听起来令人困惑,请告诉我,我会尽力澄清.
谢谢
最佳答案 如果您使用str(或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)