我有一个关于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中大数据共享的最佳实践是什么?
1条答案
按热度按时间zbsbpyhn1#
are stored as reference counted binaries大小超过64个字节的二进制文件及其数据存储在任何进程的堆之外。如果将这样的二进制文件发送到任何进程,则不会复制基础数据。因此,如果将这样的二进制文件存储在ETS表中,然后从各个进程访问它,则不会复制基础数据。只有它的引用计数会增加/减少。我建议使用ETS表解决方案。
这里演示了在 Boot 时的内存使用情况,在将一个100 MB的二进制文件插入ETS表之后,以及在将该二进制文件的副本提取到shell进程之后。当我们将一个副本二进制文件存储在shell进程中之后,内存使用情况不会改变。如果我们从ETS或其他进程复制的是百万字符串(整数列表),情况就不会如此。
你可以在上面的链接中找到更多关于如何在Erlang中有效地使用二进制文件的信息。