2012-07-06 25 views
5

Tôi muốn có một chút làm rõ về definiton của một xô trong SAS hashtable. Câu hỏi này chính xác về tham số hashexp.Chính xác kích thước bảng trong SAS HashTable được chỉ định bởi hashexp là gì?

Theo SAS Documents, hashexp là:

kích thước bảng nội bộ đối tượng băm, nơi kích thước của bảng băm là 2n.

Giá trị của HASHEXP được sử dụng làm số mũ lũy thừa để tạo kích thước bảng băm. Ví dụ: giá trị 4 cho HASHEXP tương đương với kích thước bảng băm là 24 hoặc 16. Giá trị tối đa cho HASHEXP là 20.

Kích thước bảng băm không bằng số lượng mục có thể được lưu trữ. Hãy tưởng tượng bảng băm là một mảng của 'nhóm'. Kích thước bảng băm 16 sẽ có 16 'nhóm'. Mỗi nhóm có thể chứa số lượng mục vô hạn. Hiệu quả của bảng băm nằm trong khả năng của hàm băm để ánh xạ các mục và lấy các mục từ các nhóm.

Bạn nên đặt kích thước bảng băm tương ứng với lượng dữ liệu trong đối tượng băm để tối đa hóa hiệu quả của các thủ tục tra cứu đối tượng băm. Hãy thử các giá trị HASHEXP khác nhau cho đến khi bạn nhận được kết quả tốt nhất. Ví dụ: nếu đối tượng băm chứa một triệu mục, kích thước bảng băm 16 (HASHEXP = 4) sẽ hoạt động nhưng không hiệu quả lắm. Kích thước bảng băm là 512 hoặc 1024 (HASHEXP = 9 hoặc 10) sẽ dẫn đến hiệu suất tốt nhất.

Câu hỏi đặt ra là những gì chính xác là một băm bảng kích thước, trong khi nó không phải là một số lượng dữ liệu trong đối tượng băm?

Nếu nó được hiểu như thể chúng tôi muốn phân bổ nhiều bộ nhớ vì nó có thể là cần thiết nhưng không kém, không còn nữa. Nó là một sức mạnh của hai để làm cho mọi thứ hoạt động nhanh. Nhưng nó không giới hạn số lượng dữ liệu có thể được sử dụng, nó chỉ cho biết số tiền sẽ được sử dụng, đúng không?

Trả lời

6

Paul Dorfman (chủ nhân của băm) đi vào một chút công bằng của các chi tiết trên trang 10 của sách trắng này:

http://www2.sas.com/proceedings/forum2008/037-2008.pdf

Theo tôi được biết, hashtables lưu trữ dữ liệu của họ trong cây nhị phân. Mỗi nhóm được tạo bởi hashexp đại diện cho số lượng cây nhị phân sẽ được sử dụng để lưu trữ dữ liệu. Một hashexp 0 sẽ sử dụng một cây duy nhất, trong khi hashexp của 8 sẽ sử dụng 256 cây. Khi một tra cứu được thực hiện đối với đối tượng băm, một thuật toán nội bộ xác định cây nào tồn tại trong (dựa trên giá trị băm). Sau đó nó kiểm tra cây đó để tìm giá trị. Bằng cách tự động biết được 256 cây nào cần tìm kiếm (ví dụ) nó sẽ tự lưu lại 8 so sánh (2^8) khi so sánh với một cây nhị phân đơn.

Toàn bộ điều có vẻ phức tạp hơn rất nhiều nhưng đó là cách giải thích của tôi về lý do tại sao nó hoạt động nhanh hơn.

3

Như Rob Penridge đã chỉ ra, Paul Dorfman thực sự là SAS Hash Object Guru. Hashexp không liên quan đến kích thước của bảng băm, một lần nữa như đã đề cập trong câu trả lời của Rob.

Nếu bạn có bảng có 100ob và 10 biến số được tải vào bảng băm, thì kích thước của bảng băm đơn giản là 100obs * 10vars * 8bytes (giả sử tất cả vars số được lưu trữ dưới dạng 8byte) 7.8KB cho hoặc lấy 10%.

Hãy nhớ rằng SAS tự động phân bổ dung lượng bộ nhớ RAM vì các bản ghi được thêm vào bảng băm trong bộ nhớ, vì vậy bạn không cần chỉ định trước kích thước của nó. [Tôi đã sử dụng bảng băm thường xuyên, nhưng không thể nghĩ của bất kỳ nơi nào mà người ta có thể chỉ định kích thước trước].

Mẹo chung: nếu bạn muốn biết bảng băm của bạn lớn đến mức nào, hãy chạy một NỘI DUNG TRÌNH BÀY trên tập dữ liệu bạn muốn tải vào bảng băm và nhân "Số liệu quan sát" & "Không. ", điều này sẽ cung cấp cho kích thước bộ nhớ cần thiết theo byte. Nếu bạn có nhiều bộ nhớ thì bạn có thể tải nó vào bộ nhớ.

Các vấn đề liên quan