标签: memory-mapped-files

PHP中的内存映射文件,php:// temp和php:// memory之间有什么区别

我需要一种方法在PHP中非常简单地将文件存储在内存中,该文件正在构建,然后直接发送到另一个Web服务.我看到,从PHP 5.1开始php://temp,php://memory可以使用和流,但两者之间似乎没有太大的区别:php://temp支持stream_select()函数而php://memory不是.在这种情况下我应该使用哪一个,还是有更好的方法在PHP中执行内存映射文件?

php memory-mapped-files

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

开放系统调用的工作

我正在阅读有关内存映射文件的消息,该消息称,它比传统方法更快地打开文件或读取文件(如开放系统调用和读取系统调用),而不会给出如何打开或读取系统调用的说明.

那么我的问题 是开放系统调用是如何工作的?

据我所知,它会将文件加载到内存中,而通过使用映射文件,只有它们的地址将保存在内存中,并在需要时将所请求的页面带入内存.

我希望澄清我迄今为止的理解.

编辑

我之前的理解几乎是错误的,因为正确的解释是指Pawel接受的答案.

file-io operating-system file memory-mapped-files

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

MemoryMappedFiles无法找到路径的一部分

我有一些方法可以使用MemoryMappedFiles来编写/读取数据.如果我使用简单的字符串作为文件名,它们可以正常工作,例如"file.mmf".但是,如果我使用完整目录路径,则抛出上述异常 - Exception has been thrown by the target of an invocation. 内部异常 - {"Could not find a part of the path."}.以下是我的方法的样子:

public void WriteToFile(string fileName, string value)
{
    string newFileName = CombineDirectory(fileName);
    byte[] newValue = Encoding.UTF8.GetBytes(value);
    long capacity = newValue.Length + INT_MAXVALUE_TO_BYTEARRAY_LENGTH;

    using (var mmf = MemoryMappedFile.CreateFromFile(newFileName, FileMode.Create, newFileName, capacity))
    {
        using (var accesor = mmf.CreateViewAccessor())
        {
            byte[] newValueLength = BitConverter.GetBytes(value.Length);
            accesor.WriteArray(0, newValueLength, 0, newValueLength.Length);
            accesor.WriteArray(INT_MAXVALUE_TO_BYTEARRAY_LENGTH, newValue, 0, newValue.Length);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的路径看起来像这样:

"C:\\Users\\MyUser\\Documents\\Visual Studio 2012.mmf"
Run Code Online (Sandbox Code Playgroud)

我正在使用

Path.Combine …
Run Code Online (Sandbox Code Playgroud)

c# directory file memory-mapped-files

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

C#.NET MMF:通过内存映射文件实现专有通信只是重新命名命名管道吗?

我需要在一台机器上实现非常快速,低延迟,高吞吐量的进程间(或应用程序间)通信.

消息通常每隔几毫秒流动一次(但在几分钟内,每毫秒甚至可能有多达3-5条消息),每条消息大约不到1KB,目标往返延迟最大为1ms(通过往返我的意思是交付一条消息,然后以某种方式回叫生产者,以宣布消费者是否想要"声明"该消息).

我做了一些研究,似乎内存映射文件是最快的可能性,但我需要专有实现它周围的整个通信堆栈(共享内存的分配和管理,将消息复制到其中并从中复制消息并向消费者发信号通知新消息已准备好被消费).我在Windows上看到了显示IPC方法体系结构的图片(http://blogs.msdn.com/b/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4 .aspx)似乎这些方法已经使用了MMF.所以通过我所描述的 - 我不会通过重新实现Named Pipes已经做的事情来重新发明轮子.或者我实际上可以实现比命名管道提供的协议快得多的协议?

编辑1:将frgotten链接添加到图片,显示命名管道建立在MMF之上(http://blogs.msdn.com/b/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files- in-net-4.aspx)

c# ipc named-pipes memory-mapped-files

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

如何故意触摸内存页面?

首先,在有人抱怨之前,我意识到在理论上完美的 C++ 代码的角度来看,内存模型是一个我不应该依赖的实现细节。然而,我更喜欢表现而不是纪律。

场景是这样的:我有一个地址空间区域,我已经告诉操作系统用我选择的文件来支持它——也就是说,该文件是内存映射的。如果我对 VMM 通常如何工作的理解是正确的,那么操作系统可能会非常懒惰地将页面加载到我的映射中,并且可能仅在页面实际被触摸时才这样做。

通常我可以忽略这个细节,但在这种特殊情况下,我将映射的数据发送到工作线程池中。如果我只是天真地将指向此缓冲区的指针传递给工作线程,那么当第一次触摸页面时,工作线程本身很有可能会遇到页面错误,这将导致工作线程阻塞,直到页面物理上由 VMM 加载。

工作池的设计使得它的线程在 I/O 上阻塞是非常糟糕的,而在作业中发送的线程可以容忍被阻塞。因此,我想让我的发件人线程首先接触映射的页面,以便页面错误会阻止它。

(我知道不能保证首先触摸页面会停止工作线程中的后续页面错误,但该程序仍然会在大多数时间处于最佳状态并始终正确。)

在 x86 汇编语言中,这很简单:

; get the page's address in ebx
mov al, Byte Ptr [ebx]
Run Code Online (Sandbox Code Playgroud)

不幸的是,它在 C 或 C++ 中并不是那么简单。一个简单的实现很简单:

char *pPage = ...;
char Dummy = *pPage;
Run Code Online (Sandbox Code Playgroud)

但是,这可能行不通,因为任何有自尊的优化器都会意识到代码什么都不做,只是简单地省略了它。

我们可以使用内联汇编,但这可能会严重削弱优化器。我们可以调用一个汇编语言函数来做到这一点,但是我们有(无可否认的小)函数调用开销是不必要的。

我们可以改为创建Dummy一个外部可见的变量,这会起作用,因为编译器不能假设赋值是无意义的。但是,这可能会导致 CPU 缓存线保持的争用,从而严重降低多核系统的性能Dummy。(更不用说,我们浪费了缓存行和访问权限。)

我也想过这样做:

char volatile *pPage = ...;
char Dummy = *pPage;
Run Code Online (Sandbox Code Playgroud)

我知道volatile关键字有两个保证:

  • 编译器不会重新排序访问;和

  • 编译器不会假设连续读取之间的值相同。

但是,这似乎并不能保证编译器即使不需要它也会读取该值。

有任何想法吗?

c c++ multithreading memory-mapped-files

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

在 Linux 中读取文件的最快方法?

在 Linux 上,将文件读入字节数组/处理字节的最快方法是什么?这可能包括内存映射、系统调用等。我不熟悉许多 Linux 特定的功能。

过去我使用了 boost 内存映射,但我需要更快的 Linux 特定性能而不是可移植性。

c c++ linux memory-mapped-files linux-kernel

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

Windows 中内存映射文件的命名约定

我已经搜索了这个问题的答案,但不幸的是我没有找到任何关于它的信息!

本质上:Windows 中内存映射文件的有效名称集是什么?

  • 他们能坚持多久?
  • 什么是合法字符,例如正斜杠、连字符、标点符号等是否合法?
  • 字符顺序是否有限制,例如 mmf 名称不能以下划线开头?

编辑:我意识到这个问题的答案可能是“它们与 Windows 中的普通文件命名约定完全相同。” 然而,澄清这一点很重要。

windows memory-mapped-files

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

读取映射到内存的CSV文件的最简单方法?

当我从C ++(11)中读取文件时,我使用以下命令将它们映射到内存中:

boost::interprocess::file_mapping* fm = new file_mapping(path, boost::interprocess::read_only);
boost::interprocess::mapped_region* region = new mapped_region(*fm, boost::interprocess::read_only);
char* bytes = static_cast<char*>(region->get_address());
Run Code Online (Sandbox Code Playgroud)

当我希望非常快地逐字节读取时,这很好。但是,我创建了一个csv文件,该文件要映射到内存,读取每一行并在逗号上分割每一行。

是否可以通过对上面的代码进行一些修改来做到这一点?

(我正在映射到内存,因为我有很多内存,并且我不希望磁盘/ IO流出现任何瓶颈)。

c++ csv io boost memory-mapped-files

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

Java nio:如何使用正确的字符集从内存映射文件中读取字符

对于一个新项目,我必须读取文件的字符(具有可配置的编码)来处理输入.由于其中一些文件可能非常大(> 100MB),我想查看Java nio的内存映射文件的能力,以便更快地访问.

但是,我无法弄清楚,我是如何创建"Reader"的 - 就像使用正确的字符集解码从MappedByteBuffer中读取一样.

要创建MappedByteBuffer,我目前使用:

    RandomAccessFile raFile = new RandomAccessFile("myFile.bla", "r");
    FileChannel channel = raFile.getChannel();
    MappedByteBuffer mappedByteBuffer = channel.map(MapMode.READ_ONLY, 0, channel.size());
Run Code Online (Sandbox Code Playgroud)

我知道,我可以使用getChar()从MappedByteBuffer中获取一个字符,但是如何指定编码呢?在它所说的javadoc中,总是读取两个字节并将其组合成一个char,但是ASCII编码文件是什么?

我还找到了Channels.newReader(...)方法,但是它们只能处理通道,而不能处理内存映射文件.MappedByteBuffer有类似的东西吗?

只是为了确保:我知道内存映射是一个有点昂贵的操作,因此只对较大的文件有用.我还没有决定是否使用它,但是想要根据我的特殊用例来评估它.

非常感谢提前+最好的问候,安德烈亚斯

java nio character-encoding memory-mapped-files

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

为什么我不能写入mmaped文件

首先,我创建一个文件并将一些字符回显给它,然后捕获它显示的文件:

sasdfasdfas

asfdasfsadf

然后在C程序中,我打开文件:

int fd=open("file",O_RDWR);
Run Code Online (Sandbox Code Playgroud)

mmaped文件:

unsigned char *addr=mmap(NULL,length,PROT_WRITE,MAP_PRIVATE,fd,pa_offset);
Run Code Online (Sandbox Code Playgroud)

其中length是关于fstat获取的文件大小的int,pa_offset是0.

open函数和mmap函数都返回良好,即open返回一个像3这样的正整数,mmap返回一个正确的地址,如0x7fd36999d000.

我从addr读取文件,一切正常.当我写它时,似乎在我打印程序中的内存时成功写入,但是如果我捕获它,实际的文件内容不会改变.

我尝试了一些像使用msync()的努力,但都有相同的结果.

你们谁会好心地告诉我在哪里被绊倒了?我只是想从mmap -_-写入文件

c mmap memory-mapped-files

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