Форум сайта python.su
Вообщем нужно считывать(из любого места) и записывать в конец произвольные numpy array которые влезают в память, т.е. по сути на диске храниться большая матрица(десятки гигабайт) которую нельзя считать всю сразу по причине того, что в RAM она не влезет, а нам надо считать строки матрицы допустим с 10000 до 20000(которые в памяти могут поместиться).
hdf5 вроде как раз то что нужно? только я не смог найти внятного примера использования чтобы можно было дописывать в конец файла(не зная заранее размера, т.е. расширять матрицу).
Офлайн
опять же есть такой вариант как numpy.memmap, но получается, что размер файла на диске надо задавать заранее побольше(а это н есовсем правильно, т.к. надо хранить отдельную переменную сколько занято + память на диске выделяется подо всё заранее), т.к. добавления в конец там вроде как нету.
Отредактировано mrgloom (Окт. 11, 2013 16:24:09)
Офлайн
mrgloom
я не смог найти внятного примера
dset = f.create_dataset("some_path_in_file", compression=arhopt, shape=(l, N), maxshape=(None, N)) .... dset.resize((new_size, N))
Отредактировано doza_and (Окт. 11, 2013 20:06:48)
Офлайн
тут написано
Datasets can be resized, up to a maximum value provided at creation time. You can specify this maximum size via the maxshape argument to create_dataset or require_dataset. Shape elements with the value None indicate unlimited dimensions.так и не понятно, что конкретно происходит при ресайзе, т.е. какие накладные расходы, и почему бы не поставить unlimited dimensions сразу?
np.mean(fp, axis=0)
fp = np.memmap('C:/data_1000000x1000', dtype='float32', mode='w+', shape=(1000000,1000))
PyTables program can deal with a table with around 30 columns and 1 million entries using as low as 13 MB of memory (on a 32-bit platform).
Офлайн
Опять же про перемножение больших матриц которые лежат на диске.
import numpy as np import time rows= 10000 # it can be large for example 1kk cols= 1000 #create some data in memory data = np.arange(rows*cols, dtype='float32') data.resize((rows,cols)) #create file on disk fp0 = np.memmap('C:/data_0', dtype='float32', mode='w+', shape=(rows,cols)) fp1 = np.memmap('C:/data_1', dtype='float32', mode='w+', shape=(rows,cols)) fp0[:]=data[:] fp1[:]=data[:] #matrix transpose test tr = np.memmap('C:/data_tr', dtype='float32', mode='w+', shape=(cols,rows)) tr= np.transpose(fp1) #memory consumption? print fp1.shape print tr.shape res = np.memmap('C:/data_res', dtype='float32', mode='w+', shape=(rows,rows)) t0 = time.time() res[:]= np.dot(fp0,tr) #takes 342 seconds on my machine, if I multiplicate matrices in RAM it takes 345 seconds (I thinks it's a strange result) print res.shape print (time.time() - t0)
Отредактировано mrgloom (Окт. 15, 2013 14:18:07)
Офлайн
еще в тему
http://labrosa.ee.columbia.edu/millionsong/pages/fast-k-nn-using-hdf5
единственно непонятно за счёт чего это работает, за счёт того, что pytables предоставляет “прозрачный доступ” к numpy array или из-за того что scikits.ann умеет с большими файлами работать или у них просто всё в память и так влезает.
Офлайн
import numpy as np import time import tables import cProfile rows = 10000 cols = 1000 batches = 100 k= 10 #USING HDF5 vec= np.random.rand(1,cols) data = np.random.rand(rows,cols) fileName = 'C:\carray1.h5' shape = (rows*batches, cols) # predefined size atom = tables.UInt8Atom() #? filters = tables.Filters(complevel=5, complib='zlib') #? # h5f = tables.open_file(fileName, 'w') # ca = h5f.create_carray(h5f.root, 'carray', atom, shape, filters=filters) # for i in range(batches): # ca[i*rows:(i+1)*rows]= data[:]+i # +i to modify data # h5f.close() def test_knn(): h5f = tables.open_file(fileName) t0= time.time() d = np.empty((rows*batches,)) for i in range(batches): d[i*rows:(i+1)*rows] = ((h5f.root.carray[i*rows:(i+1)*rows]-vec)**2).sum(axis=1) print (time.time()-t0) ndx = d.argsort() print ndx[:k] h5f.close() cProfile.run('test_knn()')
Офлайн
mrgloomА почему так думаете?
думаю возможно ускорение.
mrgloomА почему так сделали? оказалось что вас ограничивает доступ к диску? Наверное надо попробовать хранить данные без сжатия, или сменить метод компрессии gzip один из самых медленных.
filters = tables.Filters(complevel=5, complib='zlib') #?
Офлайн
А почему так думаете?Думаю, что саму норму можно быстрее считать, всякие питоновские трюки по производительности, например можно поробовать numexpr. Еще можно попробовать варьировать batch_size под кокретное железо, т.е. хорошо было бы если бы алгоритм был бы автонастраиваемым.
def test_tree_knn(): h5f = tables.open_file(fileName) //так работать не будет # t0= time.time() # nbrs = NearestNeighbors(n_neighbors=k, algorithm='ball_tree').fit(h5f.root.carray) # distances, indices = nbrs.kneighbors(vec) # print (time.time()-t0) //надо еще distances, indices слеплять на каждой итерации t0= time.time() d = np.empty((rows*batches,)) for i in range(batches): nbrs = NearestNeighbors(n_neighbors=k, algorithm='ball_tree').fit(h5f.root.carray[i*rows:(i+1)*rows]) distances, indices = nbrs.kneighbors(vec) # put in dict? #d[i*rows:(i+1)*rows] = print (time.time()-t0) #ndx = d.argsort() #print ndx[:k] h5f.close()
mrgloomЯ об этом не задумывался, надо попробовать.В презентации pytables пишут, что возможен вариант, что передать сжатое+разжать займет меньше времени, чем передать несжатое.
filters = tables.Filters(complevel=5, complib='zlib') #?
А почему так сделали? оказалось что вас ограничивает доступ к диску? Наверное надо попробовать хранить данные без сжатия, или сменить метод компрессии gzip один из самых медленных.
Офлайн
mrgloomПопробовать вам проще простого
В презентации pytables пишут
Офлайн