使用内存映射文件时,它似乎是只读的或只写的。我的意思是,您不能:
我们的应用程序使用可写的内存映射文件来保存数据文件,但是由于用户可能想退出而不保存更改,因此我们必须使用用户实际编辑的临时文件。当用户选择保存更改时,原始文件将被临时文件覆盖,因此具有最新更改。这很麻烦,因为文件可能很大(> 1GB),并且复制它们需要很长时间。
我已经尝试了用于创建文件映射的标志的多种组合,但是似乎没有一种组合可以灵活地按需保存。任何人都可以确认这种情况吗?我们的应用程序是用Delphi编写的,但在本例中,它使用标准的Windows API创建映射。
FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, 2 * 65536, nil);
FBasePointer := MapViewOfFile(FileMapHandle, FILE_MAP_WRITE, FileOffsetHigh,
FileOffsetLow, NumBytes);
Run Code Online (Sandbox Code Playgroud) 我希望将绑定QImage绑定到MMF文件来操作图像,而不需要直接在光盘上使用内存.不幸的是,我的代码在内存中创建了一个副本
QFile file("Boston City Flow.jpg");
if(!file.open(QIODevice::ReadOnly))
QMessageBox::information(this, "Error", "Error");
qint64 size = file.size();
unsigned char *mmf = file.map(0, size);
QImage image;
image.loadFromData(mmf, size, NULL);
Run Code Online (Sandbox Code Playgroud)
我的程序需要处理非常大的图像.
我了解如何创建内存映射文件,但我的问题是在下面一行中说:
FileChannel roChannel = new RandomAccessFile(file, "r").getChannel();
ByteBuffer roBuf = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, SIZE);
Run Code Online (Sandbox Code Playgroud)
例如,在我将SIZE设置为2MB的情况下,这是否意味着它将仅加载2MB的文件,或者它将在文件中进一步读取并更新缓冲区,因为我从中消耗了字节?
在使用内存映射文件尽可能快地在.net中IOException读取文件流时,由于两个读取同一文件的进程锁定了文件,因此我遇到了s 的问题。
有几种用于生成内存映射文件的工厂方法,如何允许共享readonly访问?
我正在阅读帖子,它说使用BufferedReader或MappedByteBuffer.我决定用291.0 MB文件自己测试,但仍然无法决定
BufferedReader reader = new BufferedReader(new FileReader("/Users/rachana/part-00000"));
String line = null;
while((line = reader.readLine())!=null) {
System.out.println(line);
}
~~~~~~ Heap utilization in MB ~~~~~~
Start Date 21:10:20
End Date 21:17:48
Time used 448 second
7.50 min
Used Memory In MB:28
Free Memory:81
Total Memory:109
Max Memory:1820
Run Code Online (Sandbox Code Playgroud)
使用MappedByteBuffer
RandomAccessFile aFile = new RandomAccessFile
("/Users/rachana/part-00000", "r");
FileChannel inChannel = aFile.getChannel();
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
buffer.load();
for (int i = 0; i < buffer.limit(); i++)
{
System.out.print((char) buffer.get());
}
buffer.clear(); // …Run Code Online (Sandbox Code Playgroud) 我有一个 Windows 服务(在系统进程中运行)和一个需要共享配置结构的桌面应用程序。数据源自应用程序,但用户进程无权创建全局内存对象,因此我在服务开始使用 CreateFileMapping() 和基于此答案的 DACL 时创建它。这似乎工作正常:我从 CreateFileMapping() 得到一个非空句柄,GetLastError() 为 0。问题是应用程序看不到对象——OpenFileMapping() 返回一个 NULL 句柄和 ERROR_FILE_NOT_FOUND——如果我使用 WinObj 手动浏览全局对象,我也看不到它。是什么让我的对象不可见?
SECURITY_ATTRIBUTES security;
ZeroMemory(&security, sizeof(security));
security.nLength = sizeof(security);
ConvertStringSecurityDescriptorToSecurityDescriptor(
"D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GWGR;;;IU)",
SDDL_REVISION_1,
&security.lpSecurityDescriptor,
NULL);
HANDLE hFile = CreateFileMapping(INVALID_HANDLE_VALUE, &security, PAGE_READWRITE, 0, 1024*4, "Global\\gCONFIGXFILE");
DWORD fileMappingResult = GetLastError();
if (hFile)
{
CloseHandle(hFile);
}
LocalFree(security.lpSecurityDescriptor);
Run Code Online (Sandbox Code Playgroud) 我从userfaultfd的文档中看到
https://manpages.debian.org/testing/manpages-dev/userfaultfd.2.en.html http://man7.org/linux/man-pages/man2/ioctl_userfaultfd.2.html
userfaultfd 从内核 4.11 开始支持共享映射。然而,文档看起来仍然非常模糊,因为我仍然想知道这些是否包括支持文件支持的 mmap(也可以是 MAP_SHARED)?
linux memory-management shared-memory memory-mapped-files linux-kernel
我正在尝试处理一个大约 50 GB 的大文件。我正在尝试使用 numpy 内存映射访问该文件。我看到用于内存映射的文件大小有限制,32 位系统为 2GB。这是链接:https : //docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.memmap.html
我想知道使用 numpy 内存映射对文件大小是否有硬限制以获得良好的性能。
python numpy memory-mapped-files memory-mapping numpy-memmap
我是内存映射领域的新手,我想知道是否有任何方法可以使用映射到字符串的内存来读取文本文件。我真的不知道如何开始编写代码。
问候Overflowers,
我喜欢内存映射文件的灵活性,因为您可以读/写任何值类型.
有没有办法对字节数组做同样的事情而不必将它们复制到例如内存映射缓冲区中?
问候