如何在c语言的Linux POSIX模型中共享现有的动态数组?

How to share an existing dynamic array within Linux POSIX model in c language?

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

已编辑:

稍微解释一下。

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

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

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

Is it possible to share already existing dynamic array within POSIX model without copying?

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

复制 20 亿个双打可能需要几秒钟。

也许你可以使用 mremap(2)

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

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

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