如何用c语言实现Linux POSIX模型中已有动态数组的共享



我有非常大的快速增长(realloc, tcmalloc)动态数组(大约20 - 40亿倍)。在增长结束后,我想在两个不同的应用程序之间共享这个数组。我知道如何准备共享内存区域并将完整的数组复制到其中,但是这对于内存来说太浪费了,因为我必须同时保存源数组和共享目标数组。是否有可能在没有复制的情况下共享POSIX模型中已经存在的动态数组?

编辑:

小说明

我能够在POSIX模型(shm_open()和其他)中使用内存分配,但如果我这样做,我必须重新分配已经共享的内存段多次(从数据库到内存逐行读取数字)。与简单的realloc()相比,它的开销要大得多。

我有一个生产者,它从数据库中读取数据并写入共享内存。

我无法事先知道数据库中有多少条记录,因此在分配之前我无法知道共享数组的大小。出于这个原因,我不得不重新分配大数组,而生产者正在从数据库逐行读取。在内存被共享并填充之后,其他应用程序从共享数组中读取数据。有时可以改变这个大的共享数组的大小,并用新数据进行补充。

是否有可能在POSIX模型中共享已经存在的动态数组而不复制?

不,共享内存不是这样工作的。读取shm_overview(7) &mmap (2) .

复制20亿个双精度对象可能需要几秒钟。

也许你可以使用mremap(2)。

顺便说一句,对于POSIX共享内存,大多数计算机将与shm_open(3)共享的段的大小限制为几兆字节(不是千兆字节)。启发式地,最大共享大小(在整个计算机上)应该远远小于可用RAM的一半。

我的感觉是你的设计是不充分的,你不应该在你的情况下使用共享内存。你没有解释你试图解决的问题以及如何修改数据(你考虑过使用RDBMS吗?)同步问题是什么?

你的问题闻起来很像XY问题,所以你真的应该多做解释,多做激励,并且给出一个更广泛、更高层次的图景。

最新更新