如何只读取python中字符串列表的一部分

时间:2016-07-14 16:25:48

标签: python string list

我需要找到一种能够从包含字符串的列表中读取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但是,即使这些存储桶仍然太大而无法最终需要处理数据,所以我只想抓取部分存储桶一次。

最初,我绕过了整个桶的东西,只是把文件分成了足够小的块,以满足我的需要。然而,这导致我不得不将文件数十万次,这有点慢。我现在的希望是能够排队等待,所以当我用一个桶做某事时,我可以开始从别人那里读书。如果其中任何一个听起来令人困惑,请告诉我,我会尽力澄清。

由于

2 个答案:

答案 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.