URLでユーザーアクセスタイプを検索する必要があるサーバー用にコーディングしようとしています。
現在、最初は、1日に1億の異なるURLにアクセスしていることがわかります。現在、それは1日あたり約6億の異なるURLになりました。
1億人の場合、私たちが行ったことは次のとおりです。
1)キーがURLの一部(LONGとして表される)であり、値がURLの他の部分(INTとして表される)である並列配列を使用してHashMapを構築します-キーは複数の値を持つことができます。
2)次に、HashMapを検索して、URLがアクセスされた回数を見つけます。
ここで、HashTableが大きくなるにつれて、次のようになりました。
1)2つまたは3つの個別のHashTableを作成し、それを(一般的なファイルシステムに)ロードして保存し、URLがアクセスされた回数を確認します。
さて、問題は、
1)HashTableのパフォーマンスは非常に優れていますが、HashTableのロード/保存中にコードに時間がかかります(ファイルチャネルを使用しており、HashTableのロード/保存に16〜19秒かかります-2億エントリ-負荷率が0.5であるため)
私たちが尋ねようとしているのは:
1)この問題を解決する方法についてコメントはありますか?
2)ロード/保存時間を短縮する方法(以前に尋ねましたが、ファイルチャネルが最善の方法のようです)?
3)大きなHashTable(メモリ以上)を保存し、それを繰り返しキャッシュすることは良い解決策になりますか?もしそうなら、それを行う方法(少なくともいくつかのポインタ)。使ってみました
RandomAccessFile raf = new RandomAccessFile("array.dat", "rw");
IntBuffer map = raf.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1 << 30).order(ByteOrder.nativeOrder()).asIntBuffer();
ただし、以前よりもパフォーマンスが低下します。
ありがとう。
注意:
1)Stack Overflowの以前の提案に従って、TokyoCabinetのようないくつかのNoSQL DBを使用しますが、私たちの経験から、カスタムHashTableは、1億のキーと値のペアよりも優れたパフォーマンスを提供します。
2)システムが起動するとアプリケーションが動作を開始し、翌日にシステムが起動するため、ディスクキャッシュのデータを先読みすることはできません。
私たちが言及するのを忘れたのは:
1)私たちのアプリケーションはプロジェクトの一部であり、小さなキャンパスに適用されるため、アクセスされるURLは8億以下であると想定しています。したがって、600/700のデータ値は固定されていると考えることができます。
2)私たちの主な関心事はパフォーマンスです。
3)アプリケーションをローカルで実行する必要があります。