という名前の行列オブジェクトがあり、location
3 つの列 ( ID
、latitude
、logitude
) と 18,289 行があります。
# ID latitude longitude
# 320503 31.29530 120.5735
# 310104 31.18852 121.4365
# 310115 31.22152 121.5444
# 110105 39.92147 116.4431
各ID間のHaversine距離を計算したい。パッケージgeosphere
では、関数distm()
は対称距離行列を作成できますが、その次元は 18289 x 18289 です。ただし、R
エラーが報告されましたcannot allocate vector of size 2.5 Gb
。
同様に、ff
パッケージでは、
data.distance.ff <- ff(0, dim = c(18289, 18289))
ff
エラーは発生しませんが、マトリックスに値を割り当てると、R
エラーが再び発生します。
data.distance.ff[1:18289, 1:18289] <- distm(location[, 2:3]
エラー: サイズ 2.5 Gb のベクトルを割り当てることができません
さらに: 警告メッセージ:
1: マトリックス (0、ncol = n、nrow = n) 内:
2047Mb の合計割り当てに達しました: ヘルプ (memory.size) を参照してください
2: マトリックス (0 ) 内, ncol = n, nrow = n) : 2047Mb
の合計割り当てに達しました: help(memory.size) を 参照してくださいsize) 4: マトリックス (0, ncol = n, nrow = n) 内: 2047Mb の合計割り当てに達しました: help(memory.size) を参照してください
このエラーは次の方法で確認できます。
data.distance.ff[1:10000, 1:10000] <- distm(location[1:10000, 2:3]
そして、このエラーが発生します:
エラー: サイズ 772.1 Mb のベクトルを割り当てることができません。
私の質問は次のとおりです。
ff
マトリックス オブジェクトに値を割り当てるコードが間違っていますか?ff
代わりに、何か特別なものを使用してオブジェクトに 値を割り当てる必要がありますか?ff
オブジェクトはストレージ要件を処理 できますか?- ループを含まない適用関数を使用して距離を計算する別の方法を使用できますか?
distm()
この関数は対称であるため、必要に応じて 2 倍の大きさの行列を生成する ことがわかっています。 - ビッグデータを扱う他の方法はありますか?パッケージが Windows コンピュータで
bigmemory
動作しないようです。