2011-01-07 3 views
3

SciPy를 사용하여 일부 통계를 시도하고 있지만 입력 데이터 세트가 매우 커서 (~ 1.9GB) dbf 형식입니다. genfromtxt로 배열을 만들려고 할 때 Numpy가 오류 메시지를 반환 할 정도로 파일 크기가 큽니다. (3GB RAM을 가지고 있지만 win32를 실행 중입니다.) 다른 게시물에서"큰 텍스트 파일을 PyTables 또는 PyHDF를 통해 hdf5로 읽어 들이고 있습니까?

즉 :

Traceback (most recent call last): 

    File "<pyshell#5>", line 1, in <module> 
    ind_sum = numpy.genfromtxt(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\IND_SUM.dbf", dtype = (int, int, int, float, float, int), names = True, usecols = (5)) 

File "C:\Python26\ArcGIS10.0\lib\site-packages\numpy\lib\npyio.py", line 1335, in genfromtxt 
    for (i, line) in enumerate(itertools.chain([first_line, ], fhd)): 

MemoryError 

, 나는 PyTables에 의해 제공되는 청크 배열이 유용 할 수 있다고 볼 수 있지만 내 문제는 처음에이 데이터를 읽고 있습니다. 즉, PyTables 또는 PyHDF를 사용하면 원하는 HDF5 출력을 쉽게 만들 수 있지만 먼저 데이터를 배열로 가져 오려면 어떻게해야합니까?

예를 들어

:

import numpy, scipy, tables 

h5file = tables.openFile(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\HET_IND_SUM2.h5", mode = "w", title = "Diversity Index Results") 

group = h5.createGroup("/", "IND_SUM", "Aggregated Index Values"`) 

을 한 후 나는 테이블 또는 배열을 만들 수 있습니다 하나,하지만 어떻게 내가 원래 DBF 데이터를 다시 참조합니까? 설명에서?

의견을 보내 주셔서 감사합니다.

답변

4

데이터가 너무 커서 메모리에 저장할 수없는 경우 메모리 매핑 파일 (숫자 배열과 비슷하지만 디스크에 저장 - see docs here)로 작업 할 수 있지만 HDF5를 사용하여 비슷한 결과를 얻을 수도 있습니다 어레이에서 수행해야하는 조작에 대해 설명합니다. 분명히 이것은 많은 작업을 느리게 만들지 만, 전혀 수행 할 수없는 것보다 낫습니다.

메모리 제한을 초과하기 때문에 genfromtxt를 사용할 수 없다고 생각합니다. 대신 텍스트 파일을 한 번에 한 줄씩 반복하고 데이터를 memmap/hdf5 객체의 관련 위치에 씁니다.

"원래의 dbf 데이터를 다시 참조하는 것"이 ​​무슨 뜻인지 확실치 않습니다. 분명히 어딘가에서 온 파일 이름을 저장할 수 있습니다. HDF5 객체에는 이러한 종류의 메타 데이터를 저장하도록 설계된 "속성"이 있습니다.

또한, h5py을 사용하면 pytables보다 hdf5 파일에 액세스하는 것이 훨씬 간단하고 깨끗한 방법이라는 것을 알았습니다. 이것은 주로 선호도의 문제입니다.

+1

입력 파일이 1.9GB 인 경우 32 비트 OS에서 mmap을 수행하지 못할 수 있으며 변환을 위해 python 코드로 주소 공간을 남겨 둘 수 있습니다. – user57368

+0

많은 감사. 내가 제안한 메모리 매핑 경로를 사용해 보겠습니다. 시간을내어 의견을 나누어 주셔서 감사합니다. 내가 32 비트 OS에 의해 여전히 제한되어 있다고 염려하지만, 내가 이것을 얻었는지 여부를 알려줄 것이다. 나는 그것이 어떻게되는지 보게 될 것입니다. 다시 한 번 감사드립니다. – jsnider

0

데이터가 dbf 파일에있는 경우 my dbf package을 시도해보십시오 - 액세스중인 메모리에만 레코드가 저장되므로 필요할 때마다 레코드를 순환 할 수 있습니다.

import dbf 

table = dbf.Table(r"W:\RACER_Analyses\Terrestrial_Heterogeneity\IND_SUM.dbf") 

sums = [0, 0, 0, 0.0, 0.0, 0] 

for record in table: 
    for index in range(5): 
     sums[index] += record[index] 
관련 문제