erlang 进程间共享大二进制数据

3hvapo4f  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(200)

我有一个关于Xmb的IP数据的大的二进制数据。进程使用二进制做一些搜索算法来查找IP地址。我有三种方法。1。放入ets。但是我假设每次读访问都会复制大的二进制到进程。:(2。放入gen_server状态。进程使用gen_server:call来获得地址。最短的并发性。3。编译二进制到beam。但是当我编译时得到eheap_alloc: Cannot allocate 1318267840 bytes of memory (of type "heap")
Erlang中大数据共享的最佳实践是什么?

zbsbpyhn

zbsbpyhn1#

are stored as reference counted binaries大小超过64个字节的二进制文件及其数据存储在任何进程的堆之外。如果将这样的二进制文件发送到任何进程,则不会复制基础数据。因此,如果将这样的二进制文件存储在ETS表中,然后从各个进程访问它,则不会复制基础数据。只有它的引用计数会增加/减少。我建议使用ETS表解决方案。
这里演示了在 Boot 时的内存使用情况,在将一个100 MB的二进制文件插入ETS表之后,以及在将该二进制文件的副本提取到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}]

你可以在上面的链接中找到更多关于如何在Erlang中有效地使用二进制文件的信息。

相关问题