크기 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}]
얼랭의 바이너리를 효율적으로 사용하는 방법에 대한 자세한 정보는 위 링크에서 찾을 수 있습니다.
나쁜 조판 때문에 죄송합니다. –