大きなオブジェクト間のすべてのペアワイズ距離を計算する必要があるアルゴリズムがあります(距離は真のメトリックであるためdist(a,b) == dist(b,a)
、他のすべてのメトリック要件の中でも)。約 1000 個のオブジェクトがあるため、約 500,000 の距離を計算する必要があります。いくつかの問題があります:
- これらの 1000 個のオブジェクトはすべてシリアル化され、ディスク上の個別のファイルに格納されます。
- ディスクからそれらを読み取ることは、比較的些細な距離計算に比べて膨大な操作です。
- スワップしてからスラッシングしないと、それらすべてを同時にメモリに入れることはできません。一度に約500個のメモリに収まります。
- これは、以前のある時点でメモリを読み取って解放した後、ある時点でオブジェクトをメモリに再度読み取る必要があることを意味します。
ディスクからの読み取りがボトルネックであり、一度に半分以上を読み取ることができないことを考えると、これらのオブジェクトを読み取って解放し、読み取りの総数を最小限に抑えるアルゴリズムを考えられる人はいますか?
私は前半に読み、それらのペアごとの距離をすべて実行し、その記憶をすべて解放して後半を読み、次にそれらのペアごとの距離をすべて実行することを検討しました。この時点では、まだ前半のオブジェクトと後半のオブジェクト間の距離が必要ですが、どうすればよいかわかりません。また、いっぱいになると、現在のオブジェクトをランダムに選択して削除し、次のオブジェクトを読み取るキャッシュを持つことも検討しましたが、より良いオプションが必要だと感じています。LRU のようなものを検討しましたが、必要なオブジェクトが最後の計算で削除されたという動作につながる可能性があります。
全体として、私はちょっと立ち往生しています。何かアドバイス?