Làm thế nào để tăng tốc độ tải các hashtables lớn?


7

Theo tôi hiểu từ hướng dẫn (đoạn cuối của http://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Hash.html ) và câu hỏi /programming/11745097 / trên stackoverflow, người ta có thể lưu phiên bản in của hashtable trên đĩa để tải nó để sử dụng sau.

Ví dụ: phiên bản in của hashtable được tạo bởi

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

là như sau

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

Phiên bản in này đã là định dạng tốt nhất (để xem xét tốc độ) mà Emacs có thể sử dụng? Có một quy trình đặc biệt để định dạng lại (để biên dịch byte, để thay đổi) định dạng in ở trên thành định dạng tốt hơn (có thể chỉ đọc bằng máy) để Emacs tải hashtable này nhanh hơn. Nếu câu trả lời là khẳng định thì những cách để làm điều đó.

Câu trả lời:


3

Vâng, đó là định dạng tốt nhất (để xem xét tốc độ).


Tôi chấp nhận lời thề của bạn.
Tên

5

Bạn sẽ phải băm và chèn mọi giá trị bất kể là gì, và trừ khi bạn xử lý các bảng băm khổng lồ, thời gian không thực sự quan trọng. Tuy nhiên, nếu các bảng của bạn lớn, thì bạn nên sử dụng :sizetham số để make-hash-tablekhông xảy ra sự phân bổ lại. Khi một bảng băm đạt đến ngưỡng, việc phải phân bổ lại một vị trí mới trong bộ nhớ để đặt các giá trị và thử lại tất cả các mục hiện tại sẽ là một mất hiệu suất lớn.

Nếu bạn biết bạn sắp chèn 1 triệu mục vào bảng băm, hãy sử dụng (make-hash-table :size 1000000)

Hãy xem xét các điểm chuẩn sau:

(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)"

Bạn cũng có thể xác định hàm kiểm tra và hàm băm của riêng mình cho các bảng băm. Nếu bạn biết các khóa của mình sẽ nằm trong một bộ cụ thể, bạn có khả năng có thể viết các hàm băm và công bằng nhanh hơn khai thác điều đó. Xem : define-hash-table-test.


So sánh thời gian rất thú vị. Cảm ơn bạn. Như bạn đã chứng minh, việc đặt kích thước của bảng băm có thể ảnh hưởng đáng kể đến thời gian tạo của nó.
Tên

Tuy nhiên, hãy để tôi đề cập rằng trong câu hỏi ban đầu, tôi đã hỏi về tốc độ từ một quan điểm hơi khác. Tôi đã tạo một bảng băm lớn và tôi đã lưu bảng băm này trên đĩa (bằng lệnh in). Vì vậy, tôi có một tệp lớn với nội dung của nó là như thế nào #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data ("orange" 1 "apple" 2 ..............)). Tôi có thể tải bảng băm này. Tôi đã quan tâm để biết liệu loại tệp này là định dạng tốt nhất mà Emacs có thể sử dụng để tải nhanh bảng.
Tên

Vì vậy, sự nhấn mạnh là thời gian tải một bảng đã được lưu trên đĩa hơn là lần đầu tiên tạo.
Tên
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.