标签: mmap

附加到内存映射文件

我不断附加股票报价(整数,多头,双打等).我用mmap将此文件映射到内存中.

将新附加数据作为内存映射的一部分提供的最有效方法是什么?

我知道我可以再次打开文件(新文件描述符),然后mmap它来获取新数据,但这似乎是低效的.我建议的另一种方法是以1mb块预先分配文件,写入特定位置直到到达结尾然后将文件ftruncate为+ 1mb.

还有其他方法吗?

Doest Boost对此有何帮助?

c++ boost mmap

22
推荐指数
2
解决办法
1万
查看次数

如何从mmapped文件中读取行?

似乎mmap接口只支持readline().如果我尝试迭代对象,我会得到字符而不是完整的行.

什么是逐行读取mmap文件的"pythonic"方法?

import sys
import mmap
import os


if (len(sys.argv) > 1):
  STAT_FILE=sys.argv[1]
  print STAT_FILE
else:
  print "Need to know <statistics file name path>"
  sys.exit(1)


with open(STAT_FILE, "r") as f:
  map = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
  for line in map:
    print line # RETURNS single characters instead of whole line
Run Code Online (Sandbox Code Playgroud)

python text mmap file

21
推荐指数
2
解决办法
2万
查看次数

如果我使用mmap而不是malloc分配内存怎么办?

使用mmap(使用MAP_PRIVATE和MAP_ANONYMOUS)比使用分配内存有什么缺点malloc?对于函数范围内的数据,我会使用堆栈内存,因此不会malloc.

想到的一个缺点是动态数据结构,例如树和链表,您经常需要分配和释放小块数据.使用mmap它会有两个原因,一个用于分配4096字节的粒度,另一个用于要求进行系统调用.

但在其他情况下,你认为哪个malloc更好mmap?其次,我是否过高估计mmap动态数据结构的缺点?

的一个优点mmap超过malloc我能想到的是,内存被立即返回到操作系统,当你这样做munmap,而用malloc/free的,我猜内存uptil数据段断点再也没有回来,但存放回用.

c linux malloc memory-management mmap

21
推荐指数
3
解决办法
1万
查看次数

如何在FastCGI下运行时在多个PHP进程之间共享APC缓存?

我目前正在运行几个PHP/FastCGI副本,启用了APC(在Apache + mod_fastcgi下,如果这很重要).我可以在进程之间共享缓存吗?我如何检查它是否已经共享?(我认为apc.mmap_file_mask可能涉及ini设置,但我不知道如何使用它.)

(我认为目前共享的原因之一是,apc.mmap_file_mask当我重新加载时,apc.php web界面报告的大约3个不同的值之间会翻转.)

php mmap fastcgi apc

20
推荐指数
2
解决办法
2万
查看次数

MAP_ANONYMOUS符合C99标准

我有一个使用mmap系统调用的应用程序,我有一个问题,让它编译几个小时,看看为什么我得到MAP_ANON和MAP_ANONYMOUS未声明,我有一个较小的代码部分,我用过,我看到我可以编译它就好了,所以我尝试了一个基本的编译,这工作,我看到它添加-std = c99失败.是否有特定原因导致MAP_ANON和MAP_ANONYMOUS在C99标准中无效?我知道它们不是由POSIX定义的,而是由BSD SOURCE定义的,所以我只想知道为什么会这样.

c posix mmap glibc

20
推荐指数
1
解决办法
1万
查看次数

vmsplice()和TCP

在最初的vmsplice()实现中,有人建议如果你有一个用户区缓冲区2x可以容纳管道的最大页数,那么缓冲区后半部分成功的vmsplice()将保证内核完成使用缓冲区的前半部分.

但事实并非如此,特别是对于TCP,内核页面将被保留,直到从另一方接收到ACK.修复这个问题是未来的工作,因此对于TCP,内核仍然需要从管道中复制页面.

vmsplice()有一个SPLICE_F_GIFT选项可以处理这个,但问题是这暴露了另外两个问题 - 如何有效地从内核获取新页面,以及如何减少缓存垃圾.第一个问题是mmap需要内核清除页面,第二个问题是虽然mmap可能会使用内核中的花式kscrubd功能,但这会增加进程的工作集(缓存垃圾).

基于此,我有以下问题:

  • 通知userland关于页面安全重用的当前状态是什么?我特别感兴趣的是将splice()d拼接到套接字(TCP)上.在过去的5年里发生了什么事吗?
  • mmap/ vmsplice/ splice/ munmap目前在TCP服务器中进行零复制的最佳实践还是今天我们有更好的选择?

linux kernel mmap splice zero-copy

20
推荐指数
1
解决办法
3453
查看次数

如何从用户空间访问内核空间?

用户内存和内核内存究竟与Linux内核有何区别(在为内核空间提供安全性方面)?

我可以在用户空间的内核地址空间中编写哪些不同的方法?

我知道的一种方法是通过系统调用.我们可以使用多个系统调用,但最后它们都是系统调用.即使在系统调用中,我们也会将数据发送到内核空间,在那里它(驱动程序或各个模块)调用copy_from_user()等函数将数据从用户空间复制到内核空间.在这里,我们完全没有写入地址空间.我们只是传递一个用户指针,其中包含需要复制到内核缓冲区的数据.

我的问题是,我们有什么方法可以访问内核空间中存在的物理地址并对其执行操作?

第二,除了系统调用之外还有其他方法可以从用户应用程序写入内核空间吗?

我从stackoverflow中提到了这个链接.但我认为我的问题没有得到回答,而且是从不同的角度来看.因此,我想问一个不同的问题.

请分享您的知识...谢谢.

linux memory-management mmap linux-kernel

20
推荐指数
2
解决办法
4万
查看次数

numpy与多处理和mmap

我正在使用Python的multiprocessing模块并行处理大型numpy数组.numpy.load(mmap_mode='r')在主进程中使用内存映射数组.在那之后,multiprocessing.Pool()分叉过程(我推测).

一切似乎都很好,除了我得到的行:

AttributeError("'NoneType' object has no attribute 'tell'",)
  in `<bound method memmap.__del__ of
       memmap([ 0.57735026,  0.57735026,  0.57735026,  0.        ,  0.        ,        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,        0.        ,  0.        ], dtype=float32)>`
     ignored
Run Code Online (Sandbox Code Playgroud)

在unittest日志中.尽管如此,测试仍然没有通过.

知道那里发生了什么吗?

使用Python 2.7.2,OS X,NumPy 1.6.1.


更新:

经过一些调试后,我把原因归结为一个代码路径,该代码路径使用这个内存映射的numpy数组(一小部分)作为Pool.imap调用的输入.

显然,"问题"是multiprocessing.Pool.imap通过将输入传递给新进程的方式:它使用pickle.这不适用于mmaped numpy数组,而内部的某些内容会导致错误.

我发现Robert Kern的回复似乎解决了同样的问题.他建议为imap输入来自内存映射数组时创建一个特殊的代码路径:在生成的进程中手动映射同一个数组.

这将是如此复杂和丑陋,我宁愿忍受错误和额外的内存副本.有没有其他方法可以更轻松地修改现有代码?

python mmap numpy multiprocessing

20
推荐指数
1
解决办法
6875
查看次数

读写mmap的参数无效?

-EINVAL出于某种原因,我不明白为什么.这是我打开并尝试mmap该文件的位置:

if ((fd = open(argv[1], O_RDWR)) < 0)
{
    fprintf(stderr, "Failed to open %s: %s\n", argv[1], strerror(errno));
    return 1;
}

struct stat statbuf;
if (fstat(fd, &statbuf))
{
    fprintf(stderr, "stat filed: %s\n", strerror(errno));
    return 1;
}

char* fbase = mmap(NULL, statbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (fbase == MAP_FAILED)
{
    fprintf(stderr, "mmap failed: %s\n", strerror(errno));
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我应该补充,错误发生在mmap.

c linux virtualbox mmap

20
推荐指数
2
解决办法
2万
查看次数

带有私有匿名映射的ENOMEM的munmap()失败

我最近发现Linux不保证分配的内存mmap可以释放,munmap如果这导致VMA(虚拟内存区域)结构数超过的情况vm.max_map_count.Manpage(几乎)清楚地说明了这一点:

 ENOMEM The process's maximum number of mappings would have been exceeded.
 This error can also occur for munmap(), when unmapping a region
 in the middle of an existing mapping, since this results in two
 smaller mappings on either side of the region being unmapped.
Run Code Online (Sandbox Code Playgroud)

问题是Linux内核总是尝试合并VMA结构,munmap即使对于单独创建的映射也会失败.我能够编写一个小程序来确认这种行为:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#include <sys/mman.h>

// value of vm.max_map_count
#define VM_MAX_MAP_COUNT        (65530)

// number of vma for the empty process linked against libc …
Run Code Online (Sandbox Code Playgroud)

linux posix mmap memory-mapping enomem

20
推荐指数
1
解决办法
1319
查看次数