我在此处粘贴一些代码,这些代码使用boost iostream进行mmap并写入映射的文件:
typedef unordered_map<int, string> work;
int main()
{
work d;
d[0] = "a";
boost::iostreams::mapped_file_params params;
params.path = "map.dat";
params.new_file_size = 1000000000;
params.mode = (std::ios_base::out | std::ios_base::in);
boost::iostreams::mapped_file mf;
mf.open(params);
work* w = static_cast<work*>((void*)mf.data());
w[0] = d;
for(int i=1; i <1000000000 ;++i)
{
w->insert(std::make_pair(i, "abcdef"));
}
mf.close();
}
当我在具有8个处理器和16GB RAM的centos 6机器上执行此操作时,我观察到以下内容:
当将数据插入到内存映射文件中时,RES(来自顶部命令)不断增加,直到14GB。我的印象是,当我映射文件时,VIRT将增加而不是RES。那么当我们写入mmap文件时,是先将其写入内存,然后再提交到磁盘吗?还是使用了任何中间缓冲区/缓存?
在“ free”命令的帮助下,我还观察到内存使用量达到16GB之后,便会使用缓冲区。以下是上述代码执行时不同时间的free命令的一些快照:
total used free shared buffers cached
Mem: 16334688 10530380 5804308 0 232576 9205532
-/+ buffers/cache: 1092272 15242416
Swap: 18579448 348020 18231428
total used free shared buffers cached
Mem: 16334688 13594208 2740480 0 232608 9205800
-/+ buffers/cache: 4155800 12178888
Swap: 18579448 348020 18231428
total used free shared buffers cached
Mem: 16334688 15385944 948744 0 232648 9205808
-/+ buffers/cache: 5947488 10387200
Swap: 18579448 348020 18231428
total used free shared buffers cached
Mem: 16334688 16160368 174320 0 204940 4049224
-/+ buffers/cache: 11906204 4428484
Swap: 18579448 338092 18241356
total used free shared buffers cached
Mem: 16334688 16155160 179528 0 141584 2397820
-/+ buffers/cache: 13615756 2718932
Swap: 18579448 338092 18241356
total used free shared buffers cached
Mem: 16334688 16195960 138728 0 5440 17556
-/+ buffers/cache: 16172964 161724
Swap: 18579448 572052 18007396
此行为表示什么?
当我处理海量数据时,我想使用内存映射来降低RES的使用。但这似乎不起作用。希望将所有数据保留在内存映射文件中,并在需要时将其读回。
我使用的内存映射不正确吗?还是它的行为方式?
只要有足够的可用内存,就会发生这种情况,然后操作系统开始从保留集中清除LRU页面(除非它们被VirtualLock
/
mlock
ed或否则无法移动(如内核页面,DMA缓冲区,安全敏感数据等)。
因此,操作系统乐观地将页面保留得尽可能长(只要没有其他进程争用内存,这就会提高性能)。
这表示操作系统正在执行其工作。
您正在写入磁盘。磁盘访问比内存访问慢很多。实际将数据写到磁盘的频率取决于调整。此答案列出了Linux(您似乎正在使用)上可用的一些调整参数
问题内容: 我正在使用Linux,go和os /exec运行一些命令。我想知道一个进程的实时内存使用情况。这意味着我可以在启动进程后的任何时间(而不是在运行之后)随时请求内存使用情况。 (这就是为什么在回答测量使用golang可执行文件运行的内存使用量是 不是 一种选择对我来说) 例如: 我不需要非常精确的值,但是如果它的错误范围小于10兆字节,那就太好了。 有没有办法做到这一点,或者我需要某种命
问题内容: 是否有一个准则来估计a消耗的内存量? 寻找类似于这些准则的估计内存使用情况的东西。 问题答案: 如果您查看源代码中的字段,则有: 的评论说 用于存储规范的字符串表示形式(如果已计算)。 假设您不调用,它将保留为零字节。因此是(8 + 4 + 4)= 16个字节+ 。 本身是4 + 4 + 4 + 4 + 4 = 20字节+ 。 20 + 16总共提供了36个字节加上大小,该大小始终是表
例如,当我对select语句使用setFetchSize()方法时 select * from tablename oracle JDBC驱动程序中的大型表。它实际上限制了JDBC客户端的内存使用。 然而,我好奇的是,该语句是否会导致oracle server将所有行存储在服务器内存中,而忽略获取大小,从而导致oracle server上出现OutOfMemory错误?
要手动显示Netbeans平台上的内存使用小部件,我必须右键单击工具栏,然后选择memory。 是否有一种方法可以让内存使用小部件在启动时显示为默认?这样它将在启动时显示,而无需用户输入。
问题内容: 当redis达到“最大内存”条件时,它将允许客户端进行读取,但不能进行写入。 当然,这将导致致命错误……有什么方法可以使Rails处理缓存的读或写错误,因此,如果缓存发生问题(可用性,读取,写入等),它将继续以如果缓存设置为“关闭”? 问题答案: 您可以告诉redis在内存已满时要遵守的不同行为。 默认是 也许最好的选择是’volatile-ttl’,并确保所有缓存都包括:expire
问题内容: 有什么工具可以知道我的Java应用程序已使用了多少个本机内存?我的应用程序内存不足:当前设置是:-Xmx900m 计算机,Windows 2003 Server 32位,RAM 4GB。 还在Windows上将boot.ini更改为/ 3GB,会有什么不同吗?如果设置为Xmx900m,则可以为此进程分配多少最大本机内存?是1100m吗? 问题答案: (就我而言,我使用的是Java 8)