我有一个项目,它需要访问ASP.NET中的大量专有数据.这是通过在共享内存中加载数据在Linux/PHP上完成的.我想知道是否尝试使用内存映射文件是可行的方法,或者是否有更好的方法可以提供更好的.NET支持.我在考虑使用数据缓存但不确定缓存中保存的数据大小的所有缺陷.
我需要按顺序读取(扫描)文件并处理其内容.文件大小可以是从非常小(某些KB)到非常大(某些GB)的任何内容.
我尝试在Windows 7 64位上使用VC10/VS2010的两种技术:
我认为内存映射文件技术可能比CRT函数更快,但是一些测试显示两种情况下的速度几乎相同.
以下C++语句用于MMF:
HANDLE hFile = CreateFile(
filename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL
);
HANDLE hFileMapping = CreateFileMapping(
hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL
);
Run Code Online (Sandbox Code Playgroud)
按顺序读取文件,按块查看; 每个块SYSTEM_INFO.dwAllocationGranularity的大小.
考虑到MMF和CRT的速度几乎相同,我使用CRT功能,因为它们更简单,更多平台.但我很好奇:我是否正确使用MMF技术?在这种情况下,扫描文件的MMF性能顺序与CRT相同,这是正常的吗?
谢谢.
我用np.save()保存了几个numpy数组,并且放在一起它们非常庞大.
是否有可能将它们全部作为内存映射文件加载,然后连接并切换所有这些文件而不将任何内容加载到内存中?
我希望非.NET应用程序访问内存映射文件,但是这个应用程序不知道内存映射文件的存在,所以我需要文件路径.有可能的?
我正在使用内存映射IO作为索引文件,但问题是如果文件大部分为空,我无法调整文件大小.
之前的某个地方:
MappedByteBuffer map = raf.getChannel().map(MapMode.READ_WRITE, 0, 1 << 30);
raf.close();
// use map
map.force();
map = null;
Run Code Online (Sandbox Code Playgroud)
调整:
for (int c = 0; c < 100; c++) {
RandomAccessFile raf = new RandomAccessFile(indexFile, "rw");
try {
raf.setLength(newLen);
if (c > 0) LOG.warn("used " + c + " iterations to close mapped byte buffer");
return;
} catch (Exception e) {
System.gc();
Thread.sleep(10);
System.runFinalization();
Thread.sleep(10);
} finally {
raf.close();
}
}
Run Code Online (Sandbox Code Playgroud)
当使用Windows或Linux 32位时,我经常遇到解映问题,但在64位Linux生产环境中,一切似乎都没有警告,但文件保持原始大小.
任何人都可以解释为什么会发生这种情况和/或如何解决问题?
正如内存映射文件的名称所示,我知道可以使用MemoryMappedFileC#中的类将大文件的一部分映射到内存以进行快速数据处理.我想对内存映射文件做的是并行处理映射的内存.为了做到这一点,我有以下问题
MemoryMappedFileViewAccessor线程安全的还是Parallel.For-safe?我实际上制作了一个演示程序来测试这个问题,它似乎正在起作用.但是找不到任何关于此的参考.如果答案是肯定的,我就完成了.除此以外,MemoryMappedFileViewAccessor有ReadArray方法,但使用该方法是重复内存.在Windows中,如何跟踪CreateFileMapping()创建的文件映射对象?基本上我想知道正在使用多少内存映射文件以及它们的名称,大小等信息.谢谢!
有没有办法扩展Java内存映射字节缓冲区,以便新的大小反映回磁盘上的映射文件?
我希望使用命名共享内存来实现IPC.
为此,其中一个步骤是使用CreateFileMapping()获取映射内存对象的句柄.
我完全按照MSDN网站的说法做到:http://msdn.microsoft.com/en-us/library/aa366551( v = VS.85).aspx:
hFileMappingHandle = CreateFileMapping
(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
256, // maximum object size (low-order DWORD)
"Global\\MyFileMappingObject" // name of mapping object
);
DWORD dwError = GetLastError();
Run Code Online (Sandbox Code Playgroud)
但是,返回的句柄始终为0x0,并且返回的系统错误代码为:0x5(拒绝访问.)
有没有人有同样的经历,还有一种解决方法吗?我使用MSDN网站作为我的参考,所以我不认为,代码中存在问题.