2015-08-31 22 views
0

我遇到了NumPy的參數問題。它在內存中創建一個int64數組,其長度爲輸入數組的長度。由於我正在處理非常大的數組,所以這會打擊內存。PyTables'array上的參數

我用一個小PyTables的carray測試了NumPy的argsort,它給出了正確的輸出。現在,我想要的是排序算法直接與PyTables的數組一起工作。有沒有辦法使用標準的NumPy調用或簡單的入侵NumPy內部?

我也對非NumPy替代品開放 - 我只想完成這項工作!

回答

1

既然你與Pytables工作,我建議你使用已經內置排序表中的類。

%pylab 

import tables 
#create description of your table 
class Table_Description(tables.IsDescription): 
    column_name = tables.Int64Col() 

#create hdf5 file and table 
f=tables.open_file('test.h5',mode="w") 
a=f.create_table("/","my_table",description=Table_Description) 

# fill table 
a.append(array([randint(0,99999) for i in xrange(10000)])) 

#Create a full index (on disk if you use the tmp_dir parameter 
a.cols.column_name.create_index(9,kind='full',tmp_dir="/tmp/") 

#write changes to disc 
a.flush() 

#read indices that will sort the table 
ind=f.root.my_table.cols.column_name.index 
ind.read_indices() 
+0

這在很大程度上去我的方式。這有效地回答了我問的問題,所以我將其標記爲這樣。我會一直按順序訪問列(前N個排序行,然後第二個排序行)。爲此,有沒有辦法讓列在原地排序,以避免許多read_sorted調用? – chiroptera

+0

這是可能的。但據我所知,我一直在玩這個問題,你必須先創建一個完整的索引,然後以分類的方式複製表。然而,這只是值得的,如果你做1寫/複製,然後從同一張表讀很多。如果不復制整個表,則使用read_sorted的訪問將使用完整索引進行加速。你將不得不使用參數(chunksize等)來優化你的用例的性能。 –

+0

我嘗試了你的建議(複製原始表格)。我有一個3場,152百萬行數據集。複製整個事情需要15分鐘,順序加載數據需要1秒。使用未排序表中的read_sort加載整個數據需要13分鐘。所以,只有一次數據傳遞(我的使用),這是不值得做的排序副本。僅供參考,我自動計算離開大塊。 – chiroptera