2017-11-07 17 views
0

いくつかの巨大な行列をhttpとJSONを通じてサーバー間の通信に送信する必要があります。APIリクエストを介してスパム行列numpyを効率的に送信する

私はnumpyとscipyでPython 3.xで作業しています。

これを行うための標準的な方法はありますか?

インデックスを送信して、何らかの方法で2番目のサーバーの行列を再構築して完全な行列を得ることができたと思いますが、カスタムコードを使用してホイールを再作成しないでください。

ありがとうございます。

答えて

2

最も簡単な方法はちょうどpicklingですが、専用の機能がおそらくより効率的です!

ここでは、python3とscipyの専用のsave_npz関数(デフォルトでは圧縮を使用)を使用して、BytesIO(ファイルを使用しないでメモリに保存)というデモを行っています。

私はJSON部分に触れていませんが、これは些細なことです(ここでは文字列を用意しています)。

コード:

import io 
import scipy.sparse as sp 

mat = sp.random(100, 100, density=0.001) 
print(mat) 

# mat to serialized-string 
tmp = io.BytesIO() 
sp.save_npz(tmp, mat) 
tmp.seek(0) # back to start 
str_ = tmp.read() 
print(str_) 

# serialized-string to mat 
tmp_ = io.BytesIO(str_) 
mat_loaded = sp.load_npz(tmp_) 
print(mat_loaded) 

出力:

(59, 11)  0.137877385333 
(7, 36)  0.137729960685 
(94, 14)  0.0951372931412 
(3, 80)  0.235640993271 
(56, 54)  0.504472012678 
(8, 14)  0.657124520803 
(22, 92)  0.951629612278 
(81, 18)  0.733232743418 
(39, 16)  0.228000113182 
(17, 15)  0.127198226805 
b'PK\x03\x04\x14\x00\x00\x00\x08\x00\xd5}gK\xc9\xb8\xd0xH\x00\x00\x00\\\x00\x00\x00\n\x00\x00\x00format.npy\x9b\xec\x17\xea\x1b\x10\xc9\xc8\xe0\xc6P\xad\x9e\x92Z\x9c\\\xa4n\xa5\xa0n\x13j\xac\xae\xa3\xa0\x9e\x96_TR\x94\x98\x17\x9f_\x94\x92\n\x12wK\xcc)N\x05\x8a\x17g$\x16\xa4\x02\xf9\x1a\x9a:\n\xb5\n(\x80+\x99\x81\x81!\x1f\x8a\x01PK\x03\x04\x14\x00\x00\x00\x08\x00\xd5}gKR\xab(\x82I\x00\x00\x00X\x00\x00\x00\t\x00\x00\x00shape.npy\x9b\xec\x17\xea\x1b\x10\xc9\xc8\xe0\xc6P\xad\x9e\x92Z\x9c\\\xa4n\xa5\xa0n\x93i\xa2\xae\xa3\xa0\x9e\x96_TR\x94\x98\x17\x9f_\x94\x92\n\x12wK\xcc)N\x05\x8a\x17g$\x16\xa4\x02\xf9\x1aF:\x9a:\n\xb5\nH\x80+\x85\x81\x81\x01\x84\x01PK\x03\x04\x14\x00\x00\x00\x08\x00\xd5}gKy\xea\xf44\x99\x00\x00\x00\xa0\x00\x00\x00\x08\x00\x00\x00data.npy\x9b\xec\x17\xea\x1b\x10\xc9\xc8\xe0\xc6P\xad\x9e\x92Z\x9c\\\xa4n\xa5\xa0n\x93f\xa1\xae\xa3\xa0\x9e\x96_TR\x94\x98\x17\x9f_\x94\x92\n\x12wK\xcc)N\x05\x8a\x17g$\x16\xa4\x02\xf9\x1a\x86\x06:\x9a:\n\xb5\n\x08\xc0%\xb3,/\xec\xfb\xd2\x83\xf6%/2\x96)-<h\xefp\x7f\xf5\xabWQ;\xec\x0f\x88\xdc|]\xady\xce\xbe)\xb2\xadv\x91\xca\x03\xfb\x97\x8f\x8f3h\xb1?\xb5?\xdat\xe5\xe3\xfe\xe2w\xf6\xe5\x87W5/){n/\xc1|v\x92\xb4\xfeY{\tY9\x01\x0e\x8f\x03\xf6\x00PK\x03\x04\x14\x00\x00\x00\x08\x00\xd5}gK\x96\xb0\xb4\xa3]\x00\x00\x00x\x00\x00\x00\x07\x00\x00\x00col.npy\x9b\xec\x17\xea\x1b\x10\xc9\xc8\xe0\xc6P\xad\x9e\x92Z\x9c\\\xa4n\xa5\xa0n\x93i\xa2\xae\xa3\xa0\x9e\x96_TR\x94\x98\x17\x9f_\x94\x92\n\x12wK\xcc)N\x05\x8a\x17g$\x16\xa4\x02\xf9\x1a\x86\x06:\x9a:\n\xb5\n\x08\xc0\xc5\xcd\xc0\xc0\xa0\x02\xc4|@\x1c\x00\xc4fPv\x0c\x10\x0b\x01\xb1\x00\x10\xf3\x031\x00PK\x03\x04\x14\x00\x00\x00\x08\x00\xd5}gK\r\xef\[email protected]_\x00\x00\x00x\x00\x00\x00\x07\x00\x00\x00row.npy\x9b\xec\x17\xea\x1b\x10\xc9\xc8\xe0\xc6P\xad\x9e\x92Z\x9c\\\xa4n\xa5\xa0n\x93i\xa2\xae\xa3\xa0\x9e\x96_TR\x94\x98\x17\x9f_\x94\x92\n\x12wK\xcc)N\x05\x8a\x17g$\x16\xa4\x02\xf9\x1a\x86\x06:\x9a:\n\xb5\n\x08\xc0e\xcd\xc0\xc0\xc0\x0e\[email protected]\xcc\x0c\xc4\[email protected]\xcc\x01\[email protected]\x1c\x08\xc4\[email protected],\x08\xc4\x00PK\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xd5}gK\xc9\xb8\xd0xH\x00\x00\x00\\\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x81\x00\x00\x00\x00format.npyPK\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xd5}gKR\xab(\x82I\x00\x00\x00X\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x81p\x00\x00\x00shape.npyPK\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xd5}gKy\xea\xf44\x99\x00\x00\x00\xa0\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x81\xe0\x00\x00\x00data.npyPK\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xd5}gK\x96\xb0\xb4\xa3]\x00\x00\x00x\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x81\x9f\x01\x00\x00col.npyPK\x01\x02\x14\x00\x14\x00\x00\x00\x08\x00\xd5}gK\r\xef\[email protected]_\x00\x00\x00x\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x81!\x02\x00\x00row.npyPK\x05\x06\x00\x00\x00\x00\x05\x00\x05\x00\x0f\x01\x00\x00\xa5\x02\x00\x00\x00\x00' 
(59, 11)  0.137877385333 
(7, 36)  0.137729960685 
(94, 14)  0.0951372931412 
(3, 80)  0.235640993271 
(56, 54)  0.504472012678 
(8, 14)  0.657124520803 
(22, 92)  0.951629612278 
(81, 18)  0.733232743418 
(39, 16)  0.228000113182 
(17, 15)  0.127198226805 
+1

はあなた@saschaをありがとう!私はこれを試してみましょう! –

+0

'save_npz'は、スパース行列の属性を' npz''zip'アーカイブに書き込みます。実際には、2つのnumpy配列をバイナリ形式で保存しています。私は 'pickle'または' json'コンバータが疎行列に対して定義されているとは思わない。 'np.array' pickleは' np.save'関数を使います。 – hpaulj

+0

@hpauljだから、ここで(デフォルトを使って)ピクルスが使えないかもしれないと言っていますが、私が示したアプローチは大丈夫ですか? – sascha

関連する問題