2015-12-30 65 views
11

Şu anda, hdf5 veri kümeleri oluşturmak için h5py kullanıyorum. Bu gibi bir şey var nispeten büyük ASCII dosyası (400MB) için iyi çalışıyor. Aynı şeyi daha büyük bir veri kümesi (40GB) için de yapmak isterim. Bunu h5py ile yapmak için daha iyi veya daha etkili bir yolu var mı? Tüm veri setini belleğe yüklemekten kaçınmak istiyorum.H5py kullanarak büyük bir hdf5 veri kümesi yazma

veriler hakkında bazı bilgiler: Ben veri türünü bilemezsiniz

  1. . İdeal olarak, dtype=None'u np.loadtxt()
  2. 'dan kullanmak istiyorum. Dosyanın boyutunu (boyutlarını) bilmem.
+1

'stdio' dosya sürücüsünü kullanmayı deneyebilirsiniz (http://docs.h5py.org/en/latest/high/file.html#file-driver adresinde belirtilmiştir) – Ashalynd

+2

Boyutların ne olduğunu biliyor musunuz? Çıkış dizisinin karşılık gelen dtypes olacak? Boş bir veri kümesini doğru boyutlar/dtypes'lerle başlatabilir, sonra metin dosyasının içeriklerini yığınlar halinde okuyabilir ve bunları HDF5 veri kümesinin ilgili satırlarına yazabilirsiniz. –

+0

Hayır, boyutları ve karşılık gelen dtypesleri bilmem – NinjaGaiden

cevap

12

Bunlar, metin dosyasının başlangıcında daha küçük bir satır satırı okuyarak verilerinizin alt kümelerini bulabilirdiniz. Bunlara sahip olduktan sonra, bir resizable HDF5 dataset oluşturabilir ve yinelemeli olarak metin dosyanızdan satır parçalarını yazabilirsiniz. Biz bu verileri okuyabilir

strings,ints,floats 
a,1,0.1256290043 
b,2,0.0071402451 
c,3,0.2551627907 
d,4,0.7958570533 
e,5,0.8968247722 
f,6,0.7291124437 
g,7,0.4196829806 
h,8,0.398944394 
i,9,0.8718244087 
j,10,0.67605461 
k,11,0.7105670336 
l,12,0.6341504091 
m,13,0.1324232855 
n,14,0.7062503808 
o,15,0.1915132527 
p,16,0.4140093777 
q,17,0.1458217602 
r,18,0.1183596433 
s,19,0.0014556247 
t,20,0.1649811301 

: Şimdi içeren .csv dosyasına sahip varsayalım

import numpy as np 
import warnings 


def iter_genfromtxt(path, chunksize=100, **kwargs): 
    """Yields consecutive chunks of rows from a text file as numpy arrays. 

    Args: 
     path: Path to the text file. 
     chunksize: Maximum number of rows to yield at a time. 
     **kwargs: Additional keyword arguments are passed to `np.genfromtxt`, 
     with the exception of `skip_footer` which is unsupported. 
    Yields: 
     A sequence of `np.ndarray`s with a maximum row dimension of `chunksize`. 
    """ 
    names = kwargs.pop('names', None) 
    max_rows = kwargs.pop('max_rows', None) 
    skip_header = kwargs.pop('skip_header', kwargs.pop('skiprows', 0)) 
    if kwargs.pop('skip_footer', None) is not None: 
     warnings.warn('`skip_footer` will be ignored') 

    with open(path, 'rb') as f: 

     # The first chunk is handled separately, since we may wish to skip rows, 
     # read column headers etc. 
     chunk = np.genfromtxt(f, max_rows=chunksize, skip_header=skip_header, 
           names=names, **kwargs) 
     # Ensure that subsequent chunks have consistent dtypes and field names 
     kwargs.update({'dtype':chunk.dtype}) 

     while len(chunk): 
      yield chunk[:max_rows] 
      if max_rows is not None: 
       max_rows -= len(chunk) 
       if max_rows <= 0: 
        raise StopIteration 
      chunk = np.genfromtxt(f, max_rows=chunksize, **kwargs) 

: Burada

numpy diziler gibi bir metin dosyasından satır ardışık parçalarını verir bir jeneratör Bir seferde 5 satırın parçalarını ve sonuçta oluşan dizileri yeniden boyutlandırılabilir bir veri kümesine yazın:

Çıktı: muhtemelen daha büyük bir ChunkSize kullanmak isteyeceksiniz sizin veri kümesi için

with h5py.File('/tmp/test.h5', 'r') as f: 
    print(repr(f['data'][:])) 

# array([(b'a', 1, 0.1256290043), (b'b', 2, 0.0071402451), 
#  (b'c', 3, 0.2551627907), (b'd', 4, 0.7958570533), 
#  (b'e', 5, 0.8968247722), (b'f', 6, 0.7291124437), 
#  (b'g', 7, 0.4196829806), (b'h', 8, 0.398944394), 
#  (b'i', 9, 0.8718244087), (b'j', 10, 0.67605461), 
#  (b'k', 11, 0.7105670336), (b'l', 12, 0.6341504091), 
#  (b'm', 13, 0.1324232855), (b'n', 14, 0.7062503808), 
#  (b'o', 15, 0.1915132527), (b'p', 16, 0.4140093777), 
#  (b'q', 17, 0.1458217602), (b'r', 18, 0.1183596433), 
#  (b's', 19, 0.0014556247), (b't', 20, 0.1649811301)], 
#  dtype=[('strings', 'S1'), ('ints', '<i8'), ('floats', '<f8')]) 

.

İlgili konular