从专业人员到超级专业人员的任何问题 - 1。 - 页 27

 
sergeev:

这个问题涉及内存映射 的工作。

是否有可能动态地改变分配的内存(CreateFileMapping)及其投影(MapViewOfFile)的大小,而不借助于复制和重新创建?

就是说,问题是这样的。

在内存中创建一个CreateFileMapping对象,以便在100字节的进程(写者-读者)之间交换数据。和同样大小的100字节的MapViewOfFile。

第一个进程的写入过程可以将所有100字节的数据写入内存中,而第二个读取过程无法设法清理。

因此,挑战在于,是否有办法在不重新创建CreateFileMapping / MapViewOfFile的情况下扩大分配的内存大小?
这样,第一个进程就不会等待释放,而是继续向增加的大小写入,而第二个进程也将继续进一步读取。

你可以。但最好是一次性多分配一些。它的工作速度会更快。我在同一个库中实现了它。
 
Zhunko:
是的,你可以。但最好一次分配更大的尺寸。 。

呃,这有点名不副实。

映射根本没有大小,只是在创建时指定了最大尺寸,通常(默认)等于我们正在处理的文件的大小

视图的大小是在创建时设置的,只有在萨满教有访问标志的情况下,才可以在没有UnmapViewOfFile函数的情况下改变它,甚至可能不可能。

而且为什么要改变尺寸呢?

 
Zhunko:
是的,我们可以。
如何?不要把我送到MSDN和谷歌,我已经在那里呆了半天了。

TheXpert:

呃,这有点名不副实。

映射根本没有大小,只是在创建时指定了一个最大的大小,通常(默认)等于你正在处理的文件的大小。

这就是重点。我写的是在创建时指定大小=100字节。
其次,我不是在与物理文件打交道,只是与内存打交道。一个进程将信息传递给另一个进程。

而且为什么要改变尺寸呢?

在操作过程中,分配的内存 被填满了100字节。但新的数据出现了,因此我们必须添加它们。所以我们必须扩大这个规模来增加它们。

这就是我问的原因--如何在不进行中间复制和重新创建的情况下扩大我所分配的100字节。

我用视图得到了它,我只需要重新创建它。但CreateFileMapping对象本身呢? 能否在不关闭它的情况下将其展开?

 
显然,在 "创建 "中,映射大小被设置为固定大小。

你可能只能重新创建。

但是:如果你创建了一个巨大尺寸的稀疏文件(例如2GB),
,它将是确定的。但文件的结尾 必须在系统文件大小之外理解。

但这样一来,人们就已经要问如何同步从文件中读取的过程了--
,即如何知道数据的哪一部分被写入,在哪里写入。
 

主要来说,不需要这样的量。

进程只是异步地写/读。 而我们需要一种方法,在读者等待所有数据被写入时,写者不会不高兴。

也就是说,你需要像ArrayResize 这样的东西来扩展数组而不改变其内容。一旦阅读器抓取了所有的数据,整个内存就可以从头再写。

 
jartmailru:

但是,你必须问如何同步从文件中读取的过程------。
即如何知道数据的哪一部分被写入了,在哪里。

我一下子就解决了这个问题。

但还没有动态调整大小的功能 :(

如果瓦迪姆(Zhunko)如此慷慨,我希望他能告诉我应该使用哪些功能......
 
我再说一遍:有这样一种东西,即稀疏文件......
这意味着一个2G的文件在磁盘上占用0个字节。

嗯,你不能把文件设置为最大尺寸吗?
要传输的数据的数量?
 
jartmailru:
我再说一遍:有一种东西叫 "稀疏文件"...。
这意味着一个2G的文件在磁盘上占用0个字节。

我不使用文件,一切都通过内存完成。 我已经在上面写了三遍。

// 如果它更容易

CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_SIZE, "Local/page")。

我在这个FILE_SIZE上遇到了麻烦。

嗯,你不能将文件设置为要传输的数据的最大尺寸?
的数据量是事先不知道的。
我正在阅读关于Sparse的文章,如果它们能够动态地扩展,可能会很有用。
 
sergeev:

这就是问题的关键。 我告诉你,大小被设置为100字节。

第二,我不是在处理一个物理文件,只是在处理内存。一个进程向另一个进程传递信息。

有什么区别?其本质是一样的;只是信息被写入内存而不是磁盘。同样的,我们是在用一个通过CreateFile打开的句柄工作。

在那里(在内存中创建文件时),有必要指定可能的最大尺寸,超过这个尺寸就没有信息了。

当你工作时,分配的内存会填满100字节。

那么问题出在哪里呢?又做了一个偏移量为100字节的视图,但映射(即文件)的大小应事先考虑到这一点。

我得到了它,有风景。但是CreateFileMapping对象本身呢? 可以在不关闭它的情况下将其展开吗?

扩大它是错误的,它的尺寸应该已经考虑到了这一点。
 
TheXpert:
扩大它是错误的,它的尺寸应该已经考虑到了这一点。
这似乎是唯一的选择。