Форум сайта python.su
ну вообщем руководствуясь этим
http://pytables.github.io/usersguide/libref/helper_classes.html
если поставить complevel =0 т.е. без сжатия, то процедура занимает ~2 раза дольше, если поставить complevel = 9, то примерно столько же, что и complevel = 5, только при записи процессор жрёт сильно(хотя это не так критично).
используя
filters = tables.Filters(complevel=9, complib='blosc')
Офлайн
такой подход даёт ускорение в ~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()
Отредактировано mrgloom (Окт. 29, 2013 13:37:11)
Офлайн
еще вот такое есть, только непонятно в каком оно сейчас состоянии.
http://continuum.io/blog/blaze
Офлайн
Написал блочное перемножение для больших матриц, которое не требует много 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()
Отредактировано mrgloom (Янв. 15, 2014 15:34:48)
Офлайн