2

私のアプリケーションでは、Glib GHashTableインスタンスをディスクに保存し、後でメモリにロードする必要があります。しかし、インスタンスを直接ダンプする方法が見つかりません。

オプションは、GHashTableを直接保存するのではなく、エントリを次々に保存することです。ロードするときは、エントリを1つずつロードし、新しいハッシュテーブルに挿入します。しかし、この操作を実行するには時間がかかることがわかりました。

g_hash_table_insert(hash, (gpointer) (mer_v), (gpointer) m);

6000万エントリをロードするのに約20分かかります。エントリをロードするだけで挿入を実行しない場合、10秒しかかかりません。

では、GHashTableを効率的に保存する別の方法はありますか?ありがとう

======================

アップデート:

私のハッシュテーブルキーはuint64_tです。このコードは約10秒間実行されます。

for (i = 0; i < 60000000; i++) {
    tmp = (uint64_t*) malloc (sizeof(uint64_t));
    *tmp = i;
    g_hash_table_insert(hash, (gpointer) (tmp), (gpointer) tmp);
}

ただし、このコードは10分以上実行されます。

for (i = 0; i < meta->n_kmers; i++) {
    m = g_ptr_array_index(kmer_list, i);
    tmp = (uint64_t*) malloc (sizeof(uint64_t));
    *tmp = m->s;
    g_hash_table_insert(hash, (gpointer) (tmp), (gpointer) tmp);
}

私のエントリキーの大部分はm->s〜60ビットです。

4

3 に答える 3

3

GHashTableは、そのサイズのデータ​​セットに対して最適化されていません。つまり、独自のハッシュテーブルを作成する方がよいでしょう。

于 2013-03-27T15:16:02.817 に答える
3

おそらく、現在GIOとdconfにプライベートになっているgvdbコードを確認する必要があります。gvdbは、mmap()を介した読み取り用に最適化されたハッシュテーブルです。

https://git.gnome.org/browse/glib/tree/gio/gvdb/

GVariantを使用して、メモリ効率の高いバイナリ表現にデータを格納します。コードはLGPLv2.1+の下にあるため、互換性のあるライセンスを持つプロジェクト内でのみカットアンドペーストできます。

于 2013-03-27T19:41:59.153 に答える
1

GHashTableはおそらくユースケースに適していないというebassi(およびiain、unwind)に同意します。

SQLiteは問題なく動作するはずですが、非常に高速な埋め込みキー値ストアも多数あります。dbmのウィキペディアページには、それらの多くがリストされています。もし私があなたなら、おそらく東京内閣LevelDB、または(あなたのプロジェクトがGPL互換の場合)京都内閣を使うでしょう。

また、mallocの代わりに、スライスアロケータを検討する必要があります。まだ長いロードと保存がありますが(組み込みデータベースを使用することで排除できます)、mallocよりもかなり高速になるはずです。または、64ではなく32ビットキーを使用できる場合は、GINT_TO_POINTERを使用するだけで、処理をさらに高速化できます。

于 2013-03-28T22:03:20.957 に答える