2015-04-27 47 views
3

我想將一些醃製Numpy數組保存到SQL數據庫中。 Numpy數組是3D的,形式爲(Name (text), Data (floats), Date (int)Numpy數組到SQL表

我目前做如下(包含數據和namesdates含實際名稱和日期各自對arr引用數組arr

name_size, ~, date_size = arr.shape 
for i in range(name_size): 
    for j in range(date_size): 
     insert_into_db(name[i], date[j], arr[i,:,j) 

然而,這是非常緩慢的。我想知道如果沒有一個更有效的方法,只考慮整個對象arr

例如插入namesdates引用到數據庫中,然後再以某種方式只是一次複製的值arr直在所有(他們是有序的,並在參考正確夷爲平地,我們剛剛NameDate值插入。

+0

:是bytes類型和在Python 2.x中這將是一個str型)數組?你總是可以使用Python的'Pickle'模塊將幾乎所有的Python對象存儲在'.p'文件中,並在需要時進行訪問?這會減少很多開銷。 – ZdaR

+1

我沒有使用SQL來醃泡,我正在創建一個我以前用於更高效查詢的對象的數據庫。 pickle對象的格式是一個numpy數組,但是一旦信息被插入到數據庫中,這將是無關緊要的。 – rwolst

回答

2

如果您的數據庫無法容納本地numpy的陣列,可以使用dumpstostring方法。

dumps泡菜的數據到bytes對象在Python 3.x和一str Python 2.x中的對象,然後可以將其作爲字符串或原始字節序列存儲在數據庫中。問題在於pickle格式可能會在python或numpy版本之間改變,所以不同版本的numpy或python不一定能夠讀取它(儘管numpy開發者試圖讓pickle reader儘可能地向後兼容):

testarr = np.arange(20) 
data = testarr.dumps() 

,讓你(在python 3.x中,它是在Python 2.x的不同):

b'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02c_codecs\nencode\nq\x03X\x01\x00\x00\x00bq\x04X\x06\x00\x00\x00latin1q\x05\x86q\x06Rq\x07\x87q\x08Rq\t(K\x01K\x14\x85q\ncnumpy\ndtype\nq\x0bX\x02\x00\x00\x00i8q\x0cK\x00K\x01\x87q\rRq\x0e(K\x03X\x01\x00\x00\x00<q\x0fNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x10b\x89h\x03X\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00q\x11h\x05\x86q\x12Rq\x13tq\x14b.' 

tostring工作方式類似,它的陣列爲一個字符串格式轉換。它具有python和numpy版本應該相同的優點,但缺點是它不存儲維度,所以您需要保留維度(以及數組是否爲CFortran命令)數據庫適當重建陣列(除非它始終是相同的):

testarr = np.arange(20) 
data = testarr.tostring() 

它給你(這將是在Python 2.x和3.x相同,不同的是在Python 3.X它會你爲什麼要使用SQL酸洗numpy的

b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00' 
+0

嗨TheBlackCat,也許我的問題並不完全清楚。我現在不再關心這個事實,我的對象是一個numpy數組,我只想將numpy數組中的數據存入SQL數據庫。實際上,我的numpy數組目前是一個非常低效的數據庫,我不得不加載到內存和查詢中。 – rwolst