2016-07-28 7 views
3

Erlang을 사용하여 LRU 캐시를 구현하는 방법은 무엇입니까? 최고 Github의 프로젝트 주연Erlang LRU 캐시

LRU Cache Wiki

fogfish/cache했지만, 세그먼트 테이블 내 데이터에 대한 매우 적합하지 않았다.

barrel-db/erlang-lru은 목록을 사용하고 있습니다. 테스트 후 너무 많은 데이터가 있으면 속도가 느려집니다.

여기에 문제가있는 것 같습니다.

move_front(List, Key) -> [Key | lists:delete(Key, List)].

자바으로, 더 나은 구현 내가 LinkedList의 좋은 생각이 아니라는 것을 깨달았다 다음 LinkedList의 작업을 수행하려고하고like this

해시 맵LinkedList의를 사용했다 Erlang, like this thread.

질문은 Erlang으로 LRU 캐시를 수행하는 방법입니까?

+0

내가 얼랑은 낮은 수준의 캐시 및 작업을 수행하는 너무 높은 수준의 생각 현재, 얼랑의 핵심에서 일부 유사한 기능을 (가지고 ETS http://erlang.org/doc/man/ets.html처럼) 외부 프로젝트를 사용하기 전에 이러한 기능 중 일부를 테스트 해 보았습니까? –

+0

@MathieuK. 당신의 의견에 감사드립니다. 예, 시도했습니다. 핵심 문제는 LRU입니다. access_time을 저장하기 위해 테이블을 사용하려고했지만 모든 읽기/업데이트에 대해 테이블을 업데이트 (삭제 후 삽입)해야합니다. 이것이 더 나은 방법으로 이루어질 수 있을지 궁금합니다. – user3644708

+0

질문에 대한 답이 하나도 없습니다. Erlang에서 고성능 LRU 캐시를 구현하려면 [포트] (http://erlang.org/doc/reference_manual/ports.html) 또는 [NIF]와 상호 연결된 외부 코드를 사용하는 것이 가장 좋습니다. http://erlang.org/doc/tutorial/nif.html). C 프로그래밍은 내가 좋아하는 도메인이 아니지만 Erlang을위한 C 코드를 구현하는 예제가 필요하다면 [빔 소스 코드] (https://github.com/erlang/otp/tree/maint/erts/)를 확인할 수있다. 에뮬레이터/빔). –

답변

1

캐시의 첫 번째 구현은 두 개의 인덱스가있는 ETS를 기반으로했습니다. 하나의 ets 테이블은 TTL -> Key 관계를 보유하고 다른 ets 테이블은 Key -> Object입니다. 당신은

https://github.com/fogfish/cache/commit/8cc50bffb4178ad9ad716703507c3290e1f94821

에서 구현을 볼 수있는 두 개의 인덱스의 유지 보수를 효율적으로 분할 한 캐시 능가 원래의 구현은하지 않았다. 액터 내에서 데이터를 모델링하고 오버 헤드를 허용하지 않는 한 Erlang 데이터 구조를 사용하여 객체 별 TTL을 구현하지 않는 것이 좋습니다. 이를 해결하기위한 구현이 있습니다. 이 객체의 개념에 따라 프로세스를 사용한다 :

https://github.com/fogfish/pts

그렇지 않으면, 당신은 NIF를 구현해야