2017-12-01 16 views
2

Xmb에 대해 큰 이진 데이터 iof ip 데이터가 있습니다. 프로세스는 바이너리를 사용하여 일부 검색 알고리즘을 사용하여 IP 주소를 조회합니다. 3 가지 방법이 있습니다. 1. ets를 넣으십시오. 하지만 나는 모든 읽기 액세스가 프로세스에 큰 바이너리를 복사한다고 가정합니다. :(gen_server 상태 2. 넣어 프로세스는 gen_server 사용합니다.. 빔에 address.The 짧은 오는 동시성을 얻을 3. 컴파일 바이너리를 호출하지만 난 얻을 컴파일 할 때 eheap_alloc: Cannot allocate 1318267840 bytes of memory (of type "heap")프로세스 간 큰 바이너리 데이터 공유

하는 빅 데이터의 가장 좋은 방법. 얼랑의 주?

+0

나쁜 조판 때문에 죄송합니다. –

답변

2

크기 are stored as reference counted binaries에서 64 바이트 이상 바이너리 및 데이터는 모든 프로세스의 힙 외부에 저장된다. 이러한 바이너리는 모든 프로세스에 전송되면, 기본 데이터가 중복 하지입니다. 그래서, 만약 ETS 테이블에 그러한 바이너리를 저장 한 다음 다양한 프로세스에서 액세스하면 기본 데이터가 복사되지 않고 참조 카운트 만 증가합니다 ented/decremented. ETS 테이블 솔루션을 사용하는 것이 좋습니다.

ETS 테이블에 100MB 바이너리를 삽입하고 쉘 프로세스로 바이너리 복사본을 가져온 후 부팅시 메모리 사용에 대한 데모입니다. 셸 프로세스에 저장된 복사본 바이너리가 있으면 메모리 사용량이 변경되지 않습니다. 우리가 ETS 또는 다른 프로세스에서 복사하고있는 백만 개의 문자열 (정수 목록)이라면 동일하지 않습니다.

1> erlang:memory(). 
[{total,21912472}, 
{processes,5515456}, 
{processes_used,5510816}, 
{system,16397016}, 
{atom,223561}, 
{atom_used,219143}, 
{binary,844872}, 
{code,4808780}, 
{ets,3}] 
2> ets:new(foo, [named_table, set]). 
foo 
3> ets:insert(foo, {foo, binary:copy(<<".">>, 104857600)}). 
true 
4> erlang:memory(). 
[{total,127038632}, 
{processes,5600320}, 
{processes_used,5599952}, 
{system,121438312}, 
{atom,223561}, 
{atom_used,220445}, 
{binary,105770576}, 
{code,4908097}, 
{ets,308416}] 
5> X = ets:lookup(foo, foo). 
[{foo,<<"........................................................................................................"...>>}] 
6> erlang:memory(). 
[{total,127511632}, 
{processes,6082360}, 
{processes_used,6081992}, 
{system,121429272}, 
{atom,223561}, 
{atom_used,220445}, 
{binary,105761504}, 
{code,4908097}, 
{ets,308416}] 

얼랭의 바이너리를 효율적으로 사용하는 방법에 대한 자세한 정보는 위 링크에서 찾을 수 있습니다.

+0

조회 후 약 482040 바이트 증가한 processes_used는 무엇입니까? 삽입 후 ets에서 동일한 메모리가 증가한다고 가정했지만, ets는 7184 바이트 만 증가시킵니다. –

+0

값은 항상 백그라운드에서 실행되고 가비지 컬렉터가 실행되므로 소량으로 변동합니다. 바이너리가 "바이너리"힙에 저장되기 때문에 ETS의 메모리가 증가하지 않았습니다. ETS는 바이너리가 큰 경우 프로세스가 수행하는 것처럼 바이너리에 대한 참조 만 저장합니다. – Dogbert

+0

답변 3q –