我想通过使用来自几个线程(和进程!)的MemoryMappedFile来读取每个字节的文件(1 gb),我的示例代码:
static unsafe void T()
{
MemoryMappedFile mmf = null;
var mmfName = "q1";
var fname = @"%file_name%";
lock (Lock)
{
try
{
mmf = MemoryMappedFile.OpenExisting(mmfName, MemoryMappedFileRights.Read, HandleInheritability.Inheritable);
Console.WriteLine("ok - open");
}
catch
{
FileStream fs = null;
try
{
fs = new FileStream(fname, System.IO.FileMode.Open, FileAccess.Read, FileShare.Read, 4 * 1024, true);
mmf = MemoryMappedFile.CreateFromFile(fs, mmfName, 0, MemoryMappedFileAccess.Read, null, HandleInheritability.Inheritable, false);
Console.WriteLine("ok - load");
}
catch
{
Console.WriteLine("fail");
}
}
}
var size = new System.IO.FileInfo(fname).Length;
byte* ptr = (byte*)0;
var vh = mmf.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read).SafeMemoryMappedViewHandle;
vh.AcquirePointer(ref ptr);
var rnd = new Random();
for (int i = 0; i < size; i++)
{
var t = *(ptr + (int)rnd.Next(0, (int)size));
}
}
和运行测试的代码:
static unsafe void Main(string[] args)
{
Parallel.Invoke(T, T, T);
Console.WriteLine("done");
Console.ReadLine();
}
app输出:
ok - load
ok - open
ok - open
我的应用程序在内存中占用3 GB的问题(工作集)。所以它在内存中复制文件3次。我想在内存(1 gb)中只有一个副本用于“ok - load”线程,而没有用于读取(“ok - open”)线程的副本。
有什么想法吗? (c#,4.5,vs12,win7)
感谢您的帮助