Kho dữ liệu trong bộ nhớ trong Haskell


9

Tôi muốn triển khai kho dữ liệu trong bộ nhớ cho dịch vụ web trong Haskell. Tôi muốn chạy giao dịch trong STMđơn nguyên.

Khi tôi google bảng băm hơi Haskell tôi chỉ nhận được điều này: Data. BTree. HashTable. STM.Tên mô-đun và độ phức tạp cho thấy rằng điều này được thực hiện dưới dạng cây. Tôi nghĩ rằng một mảng sẽ hiệu quả hơn cho các bảng băm có thể thay đổi.

Có một lý do để tránh sử dụng một mảng cho một STMhashtable? Tôi có đạt được bất cứ điều gì với bảng băm hơi này hay tôi chỉ nên sử dụng một tham chiếu hơi nước IntMap?


Lưu ý, nếu bạn sử dụng `TVar IntMap
Daniel Gratzer

@jozefg ý bạn là gì?
Simon Bergot

Ôi xin lỗi, rõ ràng tôi đã mất phần còn lại của điều đó, tôi sẽ nói rằng bạn sẽ bị song song tào lao vì sửa đổi Store ! blahStore ! bazsẽ phải tuần tự
Daniel Gratzer

Khi bạn nói "kho dữ liệu trong bộ nhớ", bạn có ý gì đó giống như trạng thái axit không?
Ngọn lửa của Ptharien

@ Ptharien'sFlame Tôi đang tìm kiếm thứ gì đó thực sự đơn giản hơn thế. Trên thực tế tôi đang tìm kiếm một bản đồ có thể thay đổi đơn giản chạy trong đơn vị stm. Tôi biết tôi có một vài lựa chọn cho việc này và tôi đang cố gắng đánh giá cái nào tốt hơn.
Simon Bergot

Câu trả lời:


1

Vấn đề với việc thực hiện bảng băm dựa trực tiếp vào một mảng là một số thao tác trên nó chắc chắn sẽ yêu cầu thay đổi kích thước mảng thời gian tuyến tính (nghĩa là tạo một mảng lớn hơn / nhỏ hơn và sao chép tất cả dữ liệu vào nó). Có nhiều thuật toán tiêu chuẩn tiếp cận vấn đề này, như Băm tuyến tính hoặc Hầm Cuckoo .

Cách đây không lâu, một thuật toán khác có tên Hash Array Mapped Trie đã xuất hiện, nó đã trở nên phổ biến rộng rãi trên các ngôn ngữ chức năng như Clojure, Scala và, tất nhiên, Haskell (với các thư viện "không có thứ tự" và "hamtmap") do sự hỗ trợ của liên tục cấu trúc dữ liệu.

Cách đây không lâu, tôi đã phát hành một thư viện container chuyên dụng STM dựa trên thuật toán có tên "stm-container", phù hợp hoàn hảo với nhiệm vụ của bạn. Bạn cũng có thể kiểm tra một bài đăng blog giới thiệu , bao gồm một động lực đằng sau thư viện và cung cấp điểm chuẩn.


Cảm ơn vì đã trả lời! Tôi chưa thử gói của bạn nhưng có vẻ thú vị. Tôi sẽ kiểm tra nó sau, nhưng dựa trên bài đăng của bạn, tôi sẵn sàng tin rằng nó phù hợp với mục tiêu ban đầu của tôi.
Simon Bergot

1

Việc triển khai mà bạn tham chiếu là một phần của gói triển khai B-Tree đồng thời. Bản thân HashTable được triển khai như một mảng TVars của các đối tượng Data.Map.

Các giá trị phức tạp được trích dẫn là trường hợp xấu nhất . Hãy nhớ rằng hashtables thường là trường hợp xấu nhất O (N) để tra cứu, chèn và xóa. Sử dụng Bản đồ cho các thùng sẽ đưa nó xuống O (log (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.