Open yukiregista opened 3 months ago
n=2^9-1 (-2?) までuint8で工夫してできるはず (DISTがn/2以上の場合はアルゴリズム的には意味のないエントリーなので、n/2に設定するなどすれば良い)
np.intx
型は、そのままだとoverheadがかなり大きい。
以下の例だと、4bytesのinteger->28 bytes, 1byteのinteger->25 bytesになっていて、Pythonのoverheadが24 bytesもある
>>> d = np.int32(10)
>>> d.__sizeof__()
28
>>> d = np.int8(10)
>>> d.__sizeof__()
25
一方で、numpy arrayの要素を一つ増やしても、その分だけしかメモリが変わらない(のでやはり型を変えるメリットはありそう)
>>> a = np.array([1], dtype=np.int8)
>>> a.__sizeof__()
113
>>> a = np.array([1,2], dtype=np.int8)
>>> a.__sizeof__()
114
>>> a = np.array([i for i in range(20)], dtype=np.int8)
>>> a.__sizeof__()
132
例えば1000trees, 100taxaで全ての枝が異なるとしたら、大体
$(1000 \times 100)^2 \times 8 = 80GB
$とかになる計算。確かにこれだと(PythonにしろCにしろ)無理。
Normalize前ならDISTの値は0..nの整数のはずなので、n<=255 の時は numpy の uint8, それ以外は uint 16 を使うなどしてメモリ削減 。-> サイズ 1/4に? 同時に下(or 上)三角行列にもする。-> サイズ1/2に?