Haskell의 인 메모리 데이터 스토어


9

Haskell에서 웹 서비스에 대한 메모리 내 데이터 저장소를 구현하고 싶습니다. STM모나드 에서 트랜잭션을 실행하고 싶습니다 .

Google 해시 테이블 스팀 Haskell을 얻을 때 나는 이것을 얻습니다 : Data. BTree. HashTable. STM.모듈 이름과 복잡성은 이것이 트리로 구현되었음을 제안합니다. 가변 해시 테이블에 대해 배열이 더 효율적이어야한다고 생각합니다.

STM해시 테이블에 배열을 사용하지 않는 이유가 있습니까? 이 스팀 해시 테이블로 아무것도 얻지 못 IntMap합니까? 아니면 스팀 참조를 사용해야 합니까?


`TVar IntMap
Daniel Gratzer

@jozefg 무슨 뜻인가요?
Simon Bergot

죄송합니다 아, 분명히 내가 modifing에 때문에 엉터리 병렬 처리를 얻을 수 있습니다 말을하려고했다, 그 나머지를 분실 Store ! blah하고 Store ! baz순차적해야 할 것이다
다니엘 Gratzer

"메모리 내 데이터 스토어"라고 말하면 산성 상태 와 같은 의미 입니까?
Ptharien의 불꽃

@ Ptharien'sFlame 그보다 더 간단한 것을 찾고 있습니다. 실제로 나는 stm monad에서 실행되는 간단한 가변 맵을 찾고 있습니다. 나는 이것에 대한 몇 가지 옵션이 있으며, 어느 것이 더 나은지 평가하려고합니다.
Simon Bergot

답변:


1

배열을 직접 기반으로하는 해시 테이블 구현의 문제점은 일부 작업에 필연적으로 선형 시간 배열 크기 조정이 필요하다는 것입니다 (즉, 더 큰 / 작은 배열을 만들고 모든 데이터를 여기에 복사). 이 문제에 접근하는 Linear Hashing 또는 Cuckoo Hashing 과 같은 여러 표준 알고리즘이 있습니다 .

얼마 전 해시 어레이 매핑 트리 (Hash Array Mapped Trie) 라는 또 다른 알고리즘이 등장했는데, 이는 Clojure, Scala 및 물론 Haskell ( "정렬되지 않은 컨테이너"및 "햄 트맵"라이브러리 포함)과 같은 기능 언어에서 큰 인기를 얻었습니다. 데이터 구조.

얼마 전 저는 "stm-containers"라는 알고리즘을 기반으로 STM 전문 컨테이너 라이브러리 를 출시 했습니다.이 라이브러리 는 작업에 꼭 맞아야합니다. 라이브러리 뒤의 동기를 다루고 벤치 마크를 제공 하는 소개 블로그 게시물을 확인할 수도 있습니다 .


답장을 보내 주셔서 감사합니다! 패키지를 테스트하지는 않았지만 흥미로워 보입니다. 나중에 확인 하겠지만 귀하의 게시물을 바탕으로 처음 목표에 부합한다고 믿을 수 있습니다.
Simon Bergot

1

참조하는 구현은 동시 B-Tree를 구현하기위한 패키지의 일부입니다. HashTable 자체는 Data.Map 객체의 TVar 배열로 구현됩니다.

인용 된 복잡성 값은 최악의 경우 입니다. 해시 테이블은 일반적으로 조회, 삽입 및 삭제에 대한 최악의 경우 O (N)입니다. 버킷에 맵을 사용하면 버킷을 O (log (N))로 가져옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.