Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 28, 2013 16:24:10

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

hdf5 и python

ну вообщем руководствуясь этим
http://pytables.github.io/usersguide/libref/helper_classes.html
если поставить complevel =0 т.е. без сжатия, то процедура занимает ~2 раза дольше, если поставить complevel = 9, то примерно столько же, что и complevel = 5, только при записи процессор жрёт сильно(хотя это не так критично).
используя

filters = tables.Filters(complevel=9, complib='blosc')
получилось быстрее всего вроде.



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Офлайн

#2 Окт. 29, 2013 13:26:23

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

hdf5 и python

такой подход даёт ускорение в ~2 раза.

def squared_row_norms(X):
    return np.einsum('ij,ij->i', X, X)
def squared_euclidean_distances(data, vec):
    data2 = squared_row_norms(data)
    vec2 = squared_row_norms(vec)
    d = np.dot(data, vec.T).ravel()
    d *= -2
    d += data2
    d += vec2
    return d
	
#can be parallel?
def test_bruteforce_knn():
	h5f = tables.open_file(fileName)
	t0= time.time()
	d = np.empty((rows*batches,))
	for i in range(batches):
	#faster than naive numpy approach
		d[i*rows:(i+1)*rows] = squared_euclidean_distances(h5f.root.carray[i*rows:(i+1)*rows], vec)
	print (time.time()-t0)
	ndx = d.argsort()
	print ndx[:k]
	h5f.close()

попробовав разное соотношение batch_size к num_batches получилось, что похоже нет разницы,
т.е. без разницы 10 раз по 100к или 100 раз по 10к, видимо только при чтении hdf5 растёт потребляемая память в пике, но заранее её рассчитать думаю сложно.



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Отредактировано mrgloom (Окт. 29, 2013 13:37:11)

Офлайн

#3 Окт. 29, 2013 16:36:12

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

hdf5 и python

еще вот такое есть, только непонятно в каком оно сейчас состоянии.
http://continuum.io/blog/blaze



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Офлайн

#4 Ноя. 8, 2013 08:55:03

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

hdf5 и python

Написал блочное перемножение для больших матриц, которое не требует много RAM, единственное непонятно как его оптимизировать под конкретный компьютер и будет ли это работать лучше чем тот же своп системы(но во всяком случае более контролируемо и прозрачно), в питоне например используя numpy.memmap были проблемы(и вообще получается это более ограниченнывй подход завязанный на систему), а как работает матлаб со свопом надо еще протестировать.

import numpy as np
import tables
import time
n_row=1000
n_col=1000
n_batch=100
def test_hdf5_disk():
    rows = n_row
    cols = n_col
    batches = n_batch
    #settings for all hdf5 files
    atom = tables.Float32Atom() #if store uint8 less memory?
    filters = tables.Filters(complevel=9, complib='blosc') # tune parameters
    Nchunk = 4*1024  # ?
    chunkshape = (Nchunk, Nchunk)
    chunk_multiple = 1
    block_size = chunk_multiple * Nchunk
   
    fileName_A = 'carray_A.h5'
    shape_A = (n_row*n_batch, n_col)  # predefined size
    h5f_A = tables.open_file(fileName_A, 'w')
    A = h5f_A.create_carray(h5f_A.root, 'CArray', atom, shape_A, chunkshape=chunkshape, filters=filters)
    for i in range(batches):
        data = np.random.rand(n_row, n_col)
        A[i*n_row:(i+1)*n_row]= data[:]
    rows = n_col
    cols = n_row
    batches = n_batch
    fileName_B = 'carray_B.h5'
    shape_B = (rows, cols*batches)  # predefined size
    h5f_B = tables.open_file(fileName_B, 'w')
    B = h5f_B.create_carray(h5f_B.root, 'CArray', atom, shape_B, chunkshape=chunkshape, filters=filters)
    sz= rows/batches
    for i in range(batches):
        data = np.random.rand(sz, cols*batches)
        B[i*sz:(i+1)*sz]= data[:]
    fileName_C = 'CArray_C.h5'
    shape = (A.shape[0], B.shape[1])
    h5f_C = tables.open_file(fileName_C, 'w')
    C = h5f_C.create_carray(h5f_C.root, 'CArray', atom, shape, chunkshape=chunkshape, filters=filters)
    sz= block_size
    t0= time.time()
    for i in range(0, A.shape[0], sz):
        for j in range(0, B.shape[1], sz):
            for k in range(0, A.shape[1], sz):
                C[i:i+sz,j:j+sz] += np.dot(A[i:i+sz,k:k+sz],B[k:k+sz,j:j+sz])
    print (time.time()-t0)
    h5f_A.close()
    h5f_B.close()
    h5f_C.close()


вот тут еще интересное
http://www.tau.ac.il/~stoledo/Bib/Pubs/oocsurvey.pdf



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Отредактировано mrgloom (Янв. 15, 2014 15:34:48)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version