进程之间共享大二进制数据
Big binary data share between processes
我有一个关于 Xmb 的大二进制数据 iof ip 数据。进程使用二进制做一些搜索算法来查找 ip 地址。我有三种方法。
1.放入ets。但我想每次读取访问都会复制大二进制文件进行处理。 :(
2. 进入gen_server状态。进程使用 gen_server:call 获得 address.The 短期并发。
3.将二进制文件编译成beam。但是当我编译得到
eheap_alloc: Cannot allocate 1318267840 bytes of memory (of type "heap")
erlang大数据最佳实践有哪些分享?
大小超过 64 字节的二进制文件 are stored as reference counted binaries 并且它们的数据存储在任何进程的堆之外。如果将这样的二进制文件发送到任何进程,则基础数据 不会 重复。因此,如果您将这样的二进制文件存储在 ETS table 中,然后从各种进程访问它,则不会复制底层数据,只有它的引用计数将为 incremented/decremented。我建议使用 ETS table 解决方案。
这是启动时内存使用情况的演示,在将 100MB 二进制文件插入 ETS table 之后,以及在将二进制文件的副本提取到 shell 进程之后。在 shell 进程中存储了一个副本二进制文件后,内存使用情况不会改变。如果我们从 ETS 或其他进程复制的是百万字符串(整数列表),则情况并非如此。
1> erlang:memory().
[{total,21912472},
{processes,5515456},
{processes_used,5510816},
{system,16397016},
{atom,223561},
{atom_used,219143},
{binary,844872},
{code,4808780},
{ets,301232}]
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}]
您可以在上面的 link 中找到更多关于如何在 Erlang 中高效使用二进制文件的信息。
我有一个关于 Xmb 的大二进制数据 iof ip 数据。进程使用二进制做一些搜索算法来查找 ip 地址。我有三种方法。
1.放入ets。但我想每次读取访问都会复制大二进制文件进行处理。 :(
2. 进入gen_server状态。进程使用 gen_server:call 获得 address.The 短期并发。
3.将二进制文件编译成beam。但是当我编译得到
eheap_alloc: Cannot allocate 1318267840 bytes of memory (of type "heap")
erlang大数据最佳实践有哪些分享?
大小超过 64 字节的二进制文件 are stored as reference counted binaries 并且它们的数据存储在任何进程的堆之外。如果将这样的二进制文件发送到任何进程,则基础数据 不会 重复。因此,如果您将这样的二进制文件存储在 ETS table 中,然后从各种进程访问它,则不会复制底层数据,只有它的引用计数将为 incremented/decremented。我建议使用 ETS table 解决方案。
这是启动时内存使用情况的演示,在将 100MB 二进制文件插入 ETS table 之后,以及在将二进制文件的副本提取到 shell 进程之后。在 shell 进程中存储了一个副本二进制文件后,内存使用情况不会改变。如果我们从 ETS 或其他进程复制的是百万字符串(整数列表),则情况并非如此。
1> erlang:memory().
[{total,21912472},
{processes,5515456},
{processes_used,5510816},
{system,16397016},
{atom,223561},
{atom_used,219143},
{binary,844872},
{code,4808780},
{ets,301232}]
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}]
您可以在上面的 link 中找到更多关于如何在 Erlang 中高效使用二进制文件的信息。