2013-08-21 11 views
0

큰 비 구조적 목록 (예 : a=[0,numpy.asarray([1,2,3])])을 저장하는 데 유용한 Python 라이브러리를 알고 계십니까?큰 비 구조적 목록을 파이썬에 저장

h5py는 이러한 종류의 데이터를 지원하지 않으며 피클은 느린 것 같습니다. 다른 대안들?

내 목적을 위해 동일한 유형의 데이터 (int 유형의 numpy 배열)이지만 다른 모양을 처리한다고 가정 할 수 있습니다.

+3

cPickle 또는 일반 피클을 사용 했습니까? – user2357112

+0

가능한 중복 디스크에 numpy 배열을 보존하는 가장 좋은 방법 (http://stackoverflow.com/questions/9619199/best-way-to-preserve-numpy-arrays-on-disk) –

+0

@SlaterTyranus 나는 그렇지 않다. 'numpy' 배열을 저장하지 않기 때문에 중복 된 것으로 생각하십시오. 예를 들어서 그는 스칼라 가치를 가지며 어쩌면 무엇을 알 수 있는지 알려줍니다. 대체로'numpy' 배열을 저장하는 것보다 더 일반적인 질문이라고 생각합니다. –

답변

0

실제로 저장하고 조금의 사용자 지정 논리와 hdf5 파일에 이러한 종류의 데이터를 검색 :

import tables 
import numpy as np 

def store(filename, name, data): 
    with tables.openFile(filename, 'w') as store: 
     store.createGroup('/', name) 
     for i, item in enumerate(data): 
      store.createArray('/%s' % name, 'item_%s' % i, item) 

def read(filename, name): 
    with tables.openFile(filename, 'r') as store: 
     nodes = store.listNodes('/%s' % name) 
     data = [0] * len(nodes) 
     for node in nodes: 
      pos = int(node.name.split('_')[-1]) 
      data[pos] = node.read() 
     return data 

사용법 :

>>> a = [0, np.array([4,5,6])] 
>>> store('my_data.h5', 'a', a) 
>>> print read('my_data.h5', 'a') 
[0, array([4, 5, 6])] 

이 바로 제일 먼저 그게 내 마음에 가을, hdf5 파일에 목록을 저장하는보다 효율적인 패턴이 있다고 확신합니다. 그러나 시간을하자 심지어이 순진 구현 cPickle보다 빠른 경우 참조 :

In [7]: a = [] 
     for i in range(1, 500): 
      if i % 10 == 0: 
       a.append(i) 
      else: 
       a.append(np.random.randn(i, i)) 
In [8]: %%timeit 
     store('my_data.h5', 'a', a) 
     read_data = read('my_data.h5', 'a') 
1 loops, best of 3: 1.32 s per loop 
In [9]: %%timeit 
     with open('test.pickle', 'wb') as f: 
      cPickle.dump(a, f) 
     with open('test.pickle', 'rb') as f: 
      read_data = cPickle.load(f) 
1 loops, best of 3: 1min 58s per loop 

데이터에 따라 차이가 더 큰하거나 조금 작습니다. 그러나이 어리석은 구현이라도 numpy 배열을 포함하는 모든 데이터에 대해 cPickle보다 적어도 10 배 더 빠릅니다.

+0

깔끔하고 내가 필요한 것에 아주 가깝다. 고마워. – m4linka

0

Pickle 및 cPickle의 속도가 너무 느리다면 Marshall 또는 Shelve을 다른 두 가지 주요 상용품 직렬화 라이브러리로 간주해야합니다. 그것이 당신을 위해 작동하지 않는다면 당신은 합법적 인 데이터베이스를 사용하기를 원할 것입니다.

많은 양의 데이터를 신속하게 저장하고 검색 할 수있는 기능은 기본적으로 데이터베이스이며, 이러한 압축 모듈은 그쪽으로 나아갈 것입니다. 그들이 완벽했다면 데이터베이스가 필요 없을 것입니다.

이 두 가지 중 하나를 사용하고 싶지 않다면 실제로이 목적을위한 도구가 있지만 실제로는 일회용이라고 생각합니다. 그런 서비스에 대해 here을 볼 수는 있지만 더 많은 정보가 있습니다.