- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发一个针对桌面系统的应用程序,该系统可能只有 256MB RAM(Windows 2000 及更高版本)。在我的应用程序中,我有一个大文件 (>256MB),其中包含大约 160 字节/每个的固定记录。这个应用程序有一个相当漫长的过程,随着时间的推移,它将随机访问大约 90% 的文件(用于读取和写入)。任何给定的记录写入距离该特定记录的读取不会超过 1,000 次记录访问(我可以调整此值)。
对于此过程,我有两个明显的选择:常规 I/O(FileRead、FileWrite)和内存映射(CreateFileMapping、MapViewOfFile)。后者在具有足够内存的系统中应该更有效,但在内存不足的系统中它会换出大部分其他应用程序的内存,这在我的应用程序中是不允许的。有没有办法防止进程耗尽所有内存(例如,强制刷新我不再访问的内存页面)?如果这不可能,那么我必须求助于常规 I/O;我希望在写入部分使用重叠的 I/O(因为访问是如此随机),但文档说 writes of less than 64K are always served synchronously .
欢迎提出任何改进 I/O 的想法。
最佳答案
终于找到方法了,源自一个线程here .诀窍是在我需要取消提交的范围内使用 VirtualUnlock();尽管此函数返回错误 0x9e(“该段已解锁”)的 FALSE,但实际上已释放内存,即使页面已修改(文件已正确更新)。
这是我的示例测试程序:
#include "stdafx.h"
void getenter(void)
{
int ch;
for(;;)
{
ch = getch();
if( ch == '\n' || ch == '\r' ) return;
}
}
int main(int argc, char* argv[])
{
char* fname = "c:\\temp\\MMFTest\\TestFile.rar"; // 54 MB
HANDLE hfile = CreateFile( fname, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL );
if( hfile == INVALID_HANDLE_VALUE )
{
fprintf( stderr, "CreateFile() error 0x%08x\n", GetLastError() );
getenter();
return 1;
}
HANDLE map_handle = CreateFileMapping( hfile, NULL, PAGE_READWRITE | SEC_RESERVE, 0, 0, 0);
if( map_handle == NULL )
{
fprintf( stderr, "CreateFileMapping() error 0x%08x\n", GetLastError() );
getenter();
CloseHandle(hfile);
return 1;
}
char* map_ptr = (char*) MapViewOfFile( map_handle, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0 );
if( map_ptr == NULL )
{
fprintf( stderr, "MapViewOfFile() error 0x%08x\n", GetLastError() );
getenter();
CloseHandle(map_handle);
CloseHandle(hfile);
return 1;
}
// Memory usage here is 704KB
printf("Mapped.\n"); getenter();
for( int n = 0 ; n < 10000 ; n++ )
{
map_ptr[n*4096]++;
}
// Memory usage here is ~40MB
printf("Used.\n"); getenter();
if( !VirtualUnlock( map_ptr, 5000 * 4096 ) )
{
// Memory usage here is ~20MB
// 20MB already freed!
fprintf( stderr, "VirtualUnlock() error 0x%08x\n", GetLastError() );
getenter();
UnmapViewOfFile(map_ptr);
CloseHandle(map_handle);
CloseHandle(hfile);
return 1;
}
// Code never reached
printf("VirtualUnlock() executed.\n"); getenter();
UnmapViewOfFile(map_ptr);
CloseHandle(map_handle);
CloseHandle(hfile);
printf("Unmapped and closed.\n"); getenter();
return 0;
}
如您所见,执行 VirtualUnlock() 后程序的工作集减少了,正如我所需要的。我只需要跟踪我更改的页面,以便在适当时解锁。
关于windows - CreateFileMapping,MapViewOfFile,如何避免占用系统内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1880714/
我正在尝试使用 2 个同时运行的线程,并且都使用 FileMapping 功能通过不同的句柄将文件映射到内存中。问题是 MapViewOfFile 函数有时会将两个线程上的映射分配到相同的内存偏移量。
我想将文本写入文件。文本长度未知。所以想不出设置要使用的mapped memory的大小,就设置为100。然后,问题出现了!字符串写入成功,但剩余的100字节空间被NULL填满!!我怎样才能避免它??
使用 win32api,我希望下面的程序创建两个进程并创建一个文件映射。 (使用 C++) 我不知道我应该在 Handle CreateFileMapping(....我试过: PROCCESS_IN
我正在创建一个在不同应用程序之间共享内存的 DLL。 创建共享内存的代码如下所示: #define NAME_SIZE 4 HANDLE hSharedFile; create(char[NAME_S
我在将部分卷映射到内存时遇到问题。卷已成功打开,我可以从中读取,但 CreateFileMapping() 失败。 GetLastError() 返回 87,其中有 following意思是:“参数不
函数CreateFileMapping可用于在页面文件中分配空间(如果第一个参数是INVALID_HANDLE_VALUE)。分配的空间稍后可以内存映射到进程虚拟地址空间。 为什么我要这样做而不是仅使
我正在尝试按照 MSDN 上的教程进行操作:Creating Named Shared Memory . 不幸的是,我从 CreateFileMapping() 得到了 NULL。文件 shmfile
我有两个用 C 编写的窗口窗体应用程序,一个包含一个由两个整数组成的结构,另一个将使用 CreateFileMapping 接收它。 虽然没有直接关系,但我想准备好三个事件,这样每个进程都可以相互“对
只是想知道我是否正在像这样在 Windows 平台上创建共享内存阵列: HANDLE hFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAG
我希望使用命名共享内存实现IPC。 为此,其中一个步骤是使用 CreateFileMapping() 获取映射内存对象的句柄。 我完全按照 MSDN 网站的建议进行操作:http://msdn.mic
我正在开发一个针对桌面系统的应用程序,该系统可能只有 256MB RAM(Windows 2000 及更高版本)。在我的应用程序中,我有一个大文件 (>256MB),其中包含大约 160 字节/每个的
我是第一次尝试使用 CreateFileMapping,当我使用 GetLastError() 时出现此错误: ERROR_INVALID_HANDLE: The handle is invalid.
我按照设计在多个进程之间共享内存数据。 根据设计,应用程序需要多个内存文件,就像每个进程需要一个内存映射文件一样。但是有些进程需要更少的内存映射文件,比如 10KB 或更小。有些进程需要超过 1mb
请你帮我理解在本地/全局命名空间中是否可以有 2 个同名的共享内存对象?我知道,如果我们第一次创建了一个共享内存对象,那么我们需要调用 OpenFileMapping/MapViewOfFile 来打
亲爱的 friend ,我需要你的帮助。 我需要使用 MMF(内存映射文件)将 .bmp 文件发送到另一个进程(对话框)并在那里显示它但问题是图像以相反的颜色和上下颠倒的方式显示。 这是源代码: 在第
我正在使用 this MSDN link 上的教程实现一种将数据从一个进程传输到另一个进程的方法。尽管有人建议我 earlier question要使用 Pipe 方法,由于某些限制,我别无选择,只能
我正在使用共享内存映射进行进程间通信。该映射需要在 session 之间可见,因此我试图在全局命名空间中创建它。我知道正在运行的用户需要 SeCreateGlobalPrivilege 才能使其正常工
我正在尝试使用 CreateFileMapping 和 OpenFileMapping 在进程之间共享内存。这没有像我希望的那样工作 - OpenFileMapping 返回 null 并且 GetL
背景:我正在尝试创建一个可以被多个进程访问的内存映射文件。在下面的代码中,我只放入了与我目前必须使事情变得更简单的问题有关的代码。根据 msdn,我应该能够创建一个文件映射,映射文件的 View 并关
我担心使用内存映射 IO 的危险,通过 CreateFileMapping ,在 FAT 文件系统上。具体场景是用户直接从 U 盘打开文档(是的,你尝试禁止他们这样做!)。 MSDN Managing
我是一名优秀的程序员,十分优秀!