我正在尝试将内存映射文件用作:
hFile = ::CreateFile(State.Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
0, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, 0);//open the file
if(hFile !=INVALID_HANDLE_VALUE){
hMap= ::CreateFileMapping(hFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0);//create Mem mapping for the file in virtual memory
if( hMap!=NULL){
base = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);//load the mapped file into the RAM
//start to compare some bytes (values) from mspaint.exe file in Win7
if( *((BYTE *)base + 0x1C3DF0)== 0x05 )
i++;
if( *((BYTE *)base + 0x25250C)== 0x21 )
i++;
if( *((BYTE *)base + 0x25272A)== 0x97 …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用 mmap 在合理的时间内读取相对较大的文件。我知道 mumap 方法;但我的问题是,只要我使用该文件,我就希望它映射到我的进程空间中;与此同时,每当我的进程由于从该文件加载太多页面到 RAM 而开始耗尽空间时;我希望它们与新页面交换(或希望它们与 lru 页面交换),而不会造成任何问题。内核的内部内存管理模块是否代表我处理交换,或者我有责任删除它们(如果是,如何?mumap?)?请考虑以下因素:
我的平台是android(也是linux平台的一种),我只想阅读页面;但根本没有写入(O_RDONLY 和 PROT_READ),我使用 MAP_SHARED 因为它可能被所有其他进程共享(事实上,只有一个进程可以读取:))。
提前致谢。
如果我同时并行读写会发生什么MemoryMappedFile?是否有必要Mutext在阅读之前锁定它们,如 MSDN 上的示例所示?
我意识到.NET 4.0处于测试阶段,但我希望有人能够解决这个问题.我正在尝试从DLL创建一个内存映射文件:
FileStream file = File.OpenRead("C:\mydll.dll");
using (MemoryMappedFile mappedFile = MemoryMappedFile.CreateFromFile(file,
"PEIMAGE", 1024 * 1024, MemoryMappedFileAccess.ReadExecute))
{
using (MemoryMappedViewStream viewStream = mappedFile.CreateViewStream())
{
// read from the view stream
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,无论我做什么,我总是得到一个UnauthorizedAccessException,MSDN文档说明:
操作系统拒绝对文件的指定访问权限; 例如,access设置为Write或ReadWrite,但文件或目录是只读的.
我用Sysinternals Process Monitor监视我的应用程序,它显示该文件确实正在成功打开.我也尝试过映射其他非DLL文件的内存,但结果相同.
我正在尝试阅读一些文本文件(每个大约300 kb).到目前为止,我一直在使用Filestream打开文件并阅读它.(TAB DELIMITED).但是,我听说.net 4.0中的内存映射文件.它会让我的阅读速度更快吗?
是否有任何示例代码可以读取简单文件并比较性能?
我有一个结构,我想导出到一个文件,然后mmap()该文件.一个问题是struct有一个成员变量是一个字符串,我不确定mmap如何处理它.在这种情况下,所有这些字符串都具有相同的大小,8个字符.我正在使用Windows,虽然我正在使用我在网上找到的mmap()函数,该函数应该复制Linux mmap()函数.
结构本身定义为:
struct testStruct
{
string testString;
unsigned int testInt;
unsigned int tsetArr[9];
};
Run Code Online (Sandbox Code Playgroud)
是否可以为对象定义sizeof()的返回值?
是否可以映射包含结构数据的文件?
我必须使用什么代码将结构导出到文件,然后mmap它?
什么是利用系统页面文件支持的内存映射文件的优势(通过CreateFileMapping(INVALID_HANDLE_VALUE, ...),而不是仅仅从堆中分配内存的常用方法(malloc(...),HeapAlloc(...)等)?
我什么时候应该使用哪个?
我编写了一个代码,用于将内容写入映射缓冲区,该缓冲区使用mmap()系统调用进行映射.在我对映射缓冲区进行了一些更改之后,我调用了msync().它应该更新到磁盘上的文件.
但是,它没有对磁盘上的文件进行任何更改.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<sys/mman.h>
#include<fcntl.h>
#define FILEMODE S_IRWXU | S_IRGRP | S_IROTH
#define MAX 150
main(int argc,char *argv[])
{
int fd,ret,len;
long int len_file;
struct stat st;
char *addr;
char buf[MAX];
if(argc > 1)
{
if((fd = open(argv[1],O_RDWR | O_APPEND | O_CREAT ,FILEMODE)) < 0)
perror("Error in file opening");
if((ret=fstat(fd,&st)) < 0)
perror("Error in fstat");
len_file = st.st_size;
/*len_file having the total length of the file(fd).*/
if((addr=mmap(NULL,len_file,PROT_READ|PROT_WRITE,MAP_PRIVATE,fd,0)) == MAP_FAILED)
perror("Error in mmap");
len …Run Code Online (Sandbox Code Playgroud) 我用MemoryMappedFileas msdn做了一个简单的测试:
2个进程,1个内存映射文件:
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
{
bool mutexCreated;
Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8);
writer.Write("1");
}
mutex.ReleaseMutex();
Console.WriteLine("Start Process B and press ENTER to continue.");
Console.ReadLine();
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream, Encoding.UTF8);
Console.WriteLine("Process A says: {0}", reader.ReadString());
Console.WriteLine("Process B says: {0}", reader.ReadString());
}
mutex.ReleaseMutex();
}
Run Code Online (Sandbox Code Playgroud)
using …Run Code Online (Sandbox Code Playgroud) 我正在寻找使用C++和boost库快速编写文件.我想使用内存映射文件.但几乎所有的例子都是关于阅读.
工作很简单.有一个字符串数组.数组元素大约有2百万.
ofstream outFile("text.txt");
for (int i = 0; i < 2000000; ++i) {
outFile << strArray[i] << "\n";
}
outFile.close();
Run Code Online (Sandbox Code Playgroud)
我怎么能用内存映射文件呢?我在哪里可以找到使用内存映射文件的文件?
谢谢你的关心.