我有很大的快速增长(realloc,tcmalloc)动态数组(大约2-4亿双)。在增长结束后,我想在两个不同的应用程序之间共享此数组。我知道如何准备共享内存区域并将我的完整数组复制到其中,但这对内存来说太浪费了,因为我必须在同一时刻保留源和共享目标数组。是否可以在POSIX模型中共享已存在的动态数组而无需复制?
编辑:
一点点解释。
我可以在POSIX模型中使用内存分配(shm_open()和其他)但是如果我这样做,我必须多次重新分配已经共享的内存段(从数据库到内存逐行读取数字)。与简单的realloc()相比,它的开销要大得多。
我有一个生产者,他从数据库读取并写入共享内存。
我事先无法知道数据库中有多少条记录,因此在分配之前我无法知道共享数组的大小。出于这个原因,我必须在生产者从数据库中逐行读取时重新分配大数组。共享和填充内存后,另一个应用程序从共享阵列中读取数据。有时,这个大型共享阵列的大小可以改变,并用新数据补充。
答案 0 :(得分:2)
是否可以在POSIX模型中共享已存在的动态数组而无需复制?
不,这不是共享内存的工作原理。阅读shm_overview(7)& mmap(2)
复制20亿双打可能需要几秒钟。
也许您可以使用mremap(2)。
BTW,对于POSIX共享内存,大多数计算机将与shm_open(3)共享的段的大小限制为几兆字节(非千兆字节)。启发式地,最大共享大小(在整个计算机上)应该远小于可用RAM的一半。我的感觉是你的设计不合适,你不应该在你的情况下使用共享内存。您没有解释您要解决的问题以及数据如何修改 (你考虑过使用一些RDBMS吗?)。什么是synchronization问题?
你的问题很像一些XY problem,所以你真的应该解释更多,激励更多,也提供更广泛,更高层次的画面。