:
그것은 메모리에 전체 파일을로드하고 영원히로드처럼 보인다 수 없습니다.
이 문제인 경우 잘못 공격하고있는 것입니다. 한 번에 전체 파일을 보관할 수있는 메모리가 충분하지 않은 경우 전체 배열을 한 번에 보유하지 못할 수도 있습니다.확실히은 순수한 Python 개체를 사용하는 경우에는 사용하지 않지만 pandas
또는 numpy
을 사용하는 경우에는 사용할 수 없습니다.
그래서 디스크 기반 형식에서 다른 형식으로 변환 한 다음 원래 파일보다 훨씬 빠르게 디스크에서 데이터를 처리하도록 코드를 다시 작성해야합니다.
하나의 명백한 가능성은 탐색하거나 mmap을 통해 랜덤 액세스 할 수있는 파일입니다. 예를 들어, range(0, 1<<32)
에 모두 맞는 값으로 된 500 개의 열이 있고 보유하고있는 행의 개수를 알 수 있다고 가정 해 보겠습니다.
행을 계산하기 위해 한 번만 csv를 반복 한 다음 4 * 500 * rows
바이트의 파일을 만든 다음 다시 csv를 반복하여 struct
모듈을 사용하여 작성합니다. 그런 다음 4 * rows * col, 4 * rows * (col+1)
이상의 mmap
보기 만 생성하면 모든 열에 액세스 할 수 있습니다.
또는 대안 적으로 트랜스 포즈하십시오. 이것은 더 간단 해지고 I/O의 절반을 차지하지만 느려질 수 있습니다 (메모리 및 디스크 캐시 효과 모두로 인해).
만에 의해 열 랜덤 액세스해야하는 경우,하지 않음으로써 행, 단지 각 열에 대한 파일을 생성하고, 모든 열, 단지 mmap
해당 파일을 처리하기 위해, 또는 struct
또는 array
을 통해 읽기, 또는 사용 pandas
또는 numpy
각각을 읽거나 쓸 수 있습니다 (또는 pickle
pandas
테이블/numpy
배열로 가능).
또 다른 가능성은 키 - 값 데이터베이스를 사용하여 파일에 해당하는 큰 blob을 저장하는 것입니다. 실제로 절편 테이블/배열을 계획하는 경우 shelve.shelf
은 산세로 값을 보존하는 키 - 값 데이터베이스입니다.
이러한 아이디어를 임의로 선택하는 방법은 다음과 같습니다. 파일이 struct
를 사용하여 즉석에서 트랜스, 데이터를 저장 :
것은 내가 당신에게 별도의 파일과 struct
로 예를 들어 보겠습니다 : 이제
import csv
import struct
# You may want to check whether the column_foo.dat files already exist and are
# at least as new as input.csv, so you don't re-generate them unless the input
# data changes. That's obviously only a worthwhile optimization if you run the
# script multiple times on the exact same input.
with open('input.csv', 'rb') as f:
reader = csv.reader(f, delimiter='\t'):
column_names = next(reader)
column_files = [open('column_{}.dat'.format(column_name), 'wb')
for column_name in column_names]
for row in reader:
for i, col in enumerate(row):
value = int(col)
column_files[i].write(struct.pack('!I', value))
for f in column_files:
f.close()
을 나중에 열을 액세스하기 :
def get_column(name):
with open('column_{}.dat'.format(name), 'rb') as f:
fsize = os.path.getsize(f.fileno())
length = fsize/4
fmt = '!{}I'.format(length)
return struct.unpack(fmt, f.read())
만약 그것이 부부 공연이라면 그냥 팬더를 사용하십시오. 더 많은 시간을 들이지 않고서는 훨씬 더 빠를 방법이 없습니다. pandas를 사용하여 열에 대한 색인을 생성하고 DataFrame을 조 변경하면 –
전체 파일을 메모리에로드 할 수없고로드하는 것처럼 보입니다. 나는 판다의 최신 버전이있다. – learner
팬더 0.11을 사용하고 최근에 저장된 파일에 각각 1 ~ 4GB의 데이터 프레임 10 개를로드했습니다. 약 30 분이 걸렸지 만 피클을 사용하여 내 컴퓨터에 저장했습니다. 내가 말하고있는 것은, 30 분을 기다리는 것은 그만한 가치가 있습니다. 다른 방법에서는 20 줄이 걸리며 여전히 상당한 시간이 걸릴 것이기 때문에 실제로는 '팬더'에 그냥 내장되어 있습니다. –