2016-07-14 4 views
4

문자열이 들어있는 목록에서 x 바이트의 데이터를 읽을 수있는 방법을 찾아야합니다. 목록의 각 항목은 ~ 36MB입니다. 목록의 각 항목을 실행할 수 있어야하지만 한 번에 ~ 1KB 정도의 항목 만 가져올 수 있어야합니다. 내가 궁금 해요파이썬에서 문자열 목록의 일부만 읽는 방법

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

: 예입니다

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 

내 현재 코드 (작품의 종류, 오히려 느리고 비효율적 인 것 같다) :

은 기본적으로는 다음과 같습니다 f.read(bufSize)과 같은 것이 있지만 문자열은 없습니다. 내가 훨씬 작은 (그리고 더 관리 덩어리)로 매우 큰 파일 (몇 GB)의 데이터를 읽고 있어요

: 그것은 관련이 있지만, 더 상황이 내가 뭘하는지 경우

확실하지. 나는 f.read(chunkSize)을 사용하여 파일을 청크에 저장하고 buckets으로 저장합니다.하지만 버킷이 너무 커서 궁극적으로 데이터를 처리해야하므로 버킷의 일부만 한 번에 가져 오려고합니다.

원래 나는 양동이를 우회하여 파일을 내 용도에 맞게 충분히 작은 덩어리로 덩어리로 만들었습니다. 그러나 이로 인해 저에게 파일이 수십만 번씩 덩어리 져야하는데, 느린 속도가되었습니다. 이제는 양동이를 대기 상태로 만들 수있게되어서 하나의 양동이로 뭔가를하고있는 동안 다른 사람들에게 읽기 시작할 수있게되었습니다. 혼란스러운 부분이 있으면 알려주세요.

감사

+0

왜 덩어리를 저장해야합니까? f.read (chunkSize)를 수행하고 완료되면 버릴 때마다 데이터의 각 비트를 처리하지 않는 이유는 무엇입니까? –

+0

그게 내가 원래하고 있었던거야. 데이터를 다루는 것은 나에게 다른 데이터를 읽는 동안 하나의 데이터를 처리 할 수 ​​있도록 일부 데이터를 미리로드하는 것보다 느린 것처럼 보였습니다. 본질적으로 데이터 버퍼를 두배로 늘려 가고 있습니다. – Swoldier

+0

@Swoldier 타이밍 및 프로파일 링으로 느린 느낌을 확인 했습니까? :) –

답변

2

당신이 str 년대 (또는 byte '파이썬 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로 잘린 목록을 만드는 것이 가장 좋습니다.

관련 문제