大きなハッシュテーブルの読み込みをスピードアップする方法は?


7

マニュアル(http://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Hash.htmlの最後の段落)と質問/programming/11745097から理解できるように/ stackoverflowでは、ハッシュテーブルの印刷バージョンをディスクに保存して、後で使用するためにロードすることができます。

たとえば、以下によって作成されたハッシュテーブルの印刷版

(setq ht (make-hash-table :test 'equal))
(puthash "orange" 1 ht)
(puthash "apple" 2 ht)

以下のとおりであります

#s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("orange" 1 "apple" 2))

この印刷されたバージョンは、Emacsが使用できる(速度を考慮して)すでに最良のフォーマットですか?Emacsがこのハッシュテーブルをより速くロードするために、上記の印刷されたフォーマットをより良いフォーマット(おそらく機械可読のみ)に再フォーマットする(バイトコンパイルする、変更する)特別な手順はありますか?答えが肯定的な場合、それを行う方法は何ですか。

回答:


3

はい、これは最適なフォーマットです(速度を考慮して)。


私はあなたの誓いを受け入れます。
名前

5

どんな場合でも、すべての値をハッシュして挿入する必要があります。巨大なハッシュテーブルを扱っていない限り、費やされる時間はそれほど重要ではありません。ただし、テーブルが大きい場合は、:sizeパラメータを使用しmake-hash-tableて、再割り当てが発生しないようにする必要があります。ハッシュテーブルがしきい値に達すると、メモリ内の新しい場所を再割り当てして値を配置し、現在のすべてのエントリを再ハッシュする必要があるため、パフォーマンスが大幅に低下します。

ハッシュテーブルに100万のエントリを挿入しようとしていることがわかっている場合は、 (make-hash-table :size 1000000)

次のベンチマークを検討してください。

(benchmark 10
           '(let ((ht (make-hash-table :size 1000000)))
              (dotimes (n 1000000) (puthash n (1+ n) ht))
              ht))
"Elapsed time: 4.156233s (2.087411s in 10 GCs)"


(benchmark 10
           '(let ((ht (make-hash-table)))
              (dotimes (n 1000000) (puthash n (1+ n) ht))
              ht))
"Elapsed time: 10.276816s (7.713422s in 41 GCs)"

ハッシュテーブルの独自のテストとハッシュ関数を定義することもできます。キーが特定のセットに含まれることがわかっている場合は、それを利用するより高速な等価性とハッシュ関数を作成できる可能性があります。参照:define-hash-table-test


非常に興味深い時間比較。ありがとうございました。すでに説明したように、ハッシュテーブルのサイズを設定すると、作成時間に大きな影響を与える可能性があります。
名前

ただし、元の質問では、少し異なる観点から速度について尋ねました。私はすでに大きなハッシュテーブルを作成し、このハッシュテーブルを(印刷コマンドによって)ディスクに保存しました。だから私はのような内容の大きなファイルを持っています#s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("orange" 1 "apple" 2 ..............))。このハッシュテーブルをロードできます。このタイプのファイルが、テーブルをすばやくロードするためにEmacsが使用できる最適な形式であるかどうか知りたいと思っていました。
名前

そのため、最初に作成されたときよりも、すでに保存されているテーブルをディスクにロードするときに重点が置かれます。
名前
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.