Tag: 内存映射文件

使用内存映射视图查看大型位图图像

我有一个非常大的位图,我正在尝试使用C#应用程序查看。 这里的主要问题是我无法将其直接加载到内存中,因此我尝试使用内存映射视图库来加载它, 参考参考 文献1 , 参考文献2 , 参考文献3 , 参考文献4和参考文献五 。 到目前为止我所得到的是: –根据需要读取部分位图(例如我读取前200行)。 从我读取的行创建另一个位图并显示它。 Porblem: –重建的位图图像部分丢失颜色信息并向上显示。 示例: – [注意我在这里使用小尺寸图像并尝试显示其中一部分用于测试目的] 真实的形象: – 输出应该是(选择前200行并重建较小的位图并显示它): – 正如您所看到的,重建的图像是无色的并且是颠倒的。 现在代码部分: – 类BMPMMF,负责整个过程 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.IO.MemoryMappedFiles; using System.Drawing; using System.Runtime.InteropServices; using System.Drawing.Imaging; namespace BMPViewer { class BMPMMF { /// /// It opens […]

ipc使用Shared和全局MMF

使用MMF和C#我在2个进程之间创建了一个共享内存。 我的目标是将其创建为全局说长度为4000字节并创建分区 所以Main proj是“MainProj”将启动MMF名为”$AppName$_sharedMMF” 那么“Debugger Proj”将访问”$AppName$_sharedMMF”因此访问者位置是: MainProj->Debugger : readAddr = 0 , writeAddr = 250 Debbugger->MainProj : reafAddr = 250, writeAddr = 0 然后我解决方案中的第三个可执行文件将是 //setter getter MainProj->AnotherExe : readAddr = 251 , writeAddr = 500 //setter getter EnotherExe->MainProj : reafAddr = 500, writeAddr = 251 我面临的问题是,我希望mainProj成为MMF的全局实例 所以每次我想访问分区我都会使用相同的静态类和方法 //accessed by main project SharedSetter(SelectedGetter, Data) 1)因为它由多个线程共享它有点复杂,虽然添加分区并不像整个设置那样复杂,这是一个坏主意吗? 2)我是否真的不能跳过mmf的创建新实例步骤并将其保留为“Alive”并仅创建新的访问器? […]

c#MemoryMappedFile in .net 3.5

我需要在.net 3.5中使用MemoryMappedFile类…有没有办法找到.net 4.0中使用的类的代码并创建在.net 3.5中使用? 提前致谢

使用内存映射文件的缺点

我的Web服务每分钟写入数千个事务,我们将它们保存在高清上。 我正在测试保存这些文件的不同方法,我使用标准IO和MemoryMapped文件进行了一些测试。 在我的结果中,使用MemoryMapped文件编写文件(20 k文本文件)比标准IO快4倍,我无法找到任何缺点。 由于我对这项技术没有那么多经验,你认为我可能会遇到任何使用它们的问题,或者你没有看到任何不利之处? 谢谢! 编辑1 ,这里的来源: namespace FileWritingTests.Writers { public class MappedFileWriter : ITestWriter { public void Write(string content, string path,string id) { Byte[] data = System.Text.Encoding.UTF8.GetBytes(content); using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) using (MemoryMappedFile memoryMapped = MemoryMappedFile.CreateFromFile(fileStream, id, data.Count(), MemoryMappedFileAccess.ReadWrite, new MemoryMappedFileSecurity(), HandleInheritability.Inheritable, true)) { var viewStream = memoryMapped.CreateViewStream(); […]

附加调试器的C#代码非常慢; MemoryMappedFile的错?

我有一个客户端/服务器应用程序。 服务器组件运行,以“远程处理”方式使用WCF(二进制格式化程序,会话对象)。 如果我启动服务器组件并启动客户端,则服务器执行的第一项任务在<0.5秒内完成。 如果我在连接了VS调试器的情况下启动服务器组件,然后启动客户端,则任务需要20秒才能完成。 没有代码更改 – 没有条件编译更改。 无论我是否在32位,64位,VS主机进程,没有VS主机进程或这些东西的任何组合的情况下编译和运行服务器组件,都会出现同样的情况。 可能很重要 :如果我使用VS.NET 探查器 (采样模式),那么应用程序运行速度就像没有附加调试器一样。 所以我不能那样诊断它。 刚检查,仪表模式也快速运行。 对于并发性分析模式,同样快速。 关键数据: 该应用程序使用相当繁重的multithreading(标准线程池中有40个线程)。 无论如何创建线程都很快发生,并且不是一个慢点。 有许多锁, WaitHandle和Monitor模式 该应用程序完全没有例外。 该应用程序不会创建控制台输出 该应用程序完全是托管代码。 该应用程序确实将磁盘上的几个文件映射到MemoryMappedFile:1x750MB和12x8MB以及一些较小的文件 测量性能: 两种情况下CPU使用率都很低; 连接调试器时,CPU位于<1% 两种情况下内存使用都很少; 在这两种情况下可能都是50或60MB 发生了大量页面错误(参考MMF),但是在附加调试器时它们发生得更慢 如果没有使用VS主机进程,或者基本上“远程调试监视器”开始运行,则使用相当数量的CPU并产生大量页面错误。 但这不是问题发生的唯一时间 无论客户端如何运行,都会看到性能差异。 唯一要更改的变量是通过从Explorer启动的“Start with debugging”vs运行的服务器组件。 我的想法: 调试时WCF速度慢? MemoryMappedFiles在调试时会变慢吗? 使用了40个线程 – 调试速度慢? 也许Monitors / locks通知调试器? 线程调度变得奇怪/上下文切换非常罕见? 宇宙背景辐射赋予VS智慧和残酷的幽默感 所有人似乎都不太可能。 所以,我的问题: 为什么会这样? 如果#1未知,我该如何诊断/发现?

数据结构的最佳存储,以实现快速查找和持久性

脚本 我有以下方法: public void AddItemSecurity(int itemId, int[] userIds) public int[] GetValidItemIds(int userId) 最初我在思考表单上的存储: itemId -> userId, userId, userId 和 userId -> itemId, itemId, itemId AddItemSecurity基于我如何从第三方API获取数据, GetValidItemIds是我想在运行时使用它的方式。 可能有2000个用户和1000万个项目。 项目ID在表格上:2007123456,2010001234(10位数,前四位代表年份)。 AddItemSecurity不必执行超快速,但GetValidIds需要亚秒。 此外,如果现有的itemId有更新,我需要删除列表中不再存在的用户的itemId。 我正在考虑如何以最佳方式存储它。 最好是在磁盘上(带缓存),但我希望代码可维护和清洁。 如果项目id从0开始,我想为每个用户创建一个长度为MaxItemId / 8的字节数组,如果该项目存在与否则设置一个真/假位。 这将限制每个用户的arrays长度超过1mb,并提供快速查找以及更新每个用户列表的简便方法。 通过使用.Net 4框架将其保存为内存映射文件 ,我认为我也可以获得不错的缓存(如果机器有足够的RAM),而无需自己实现缓存逻辑。 解析id,剥离年份,每年存储一个arrays可能是一个解决方案。 ItemId – > UserId []列表可以直接序列化到磁盘并使用普通的FileStream进行读/写,以便在发生更改时保留列表并进行区分。 每次添加新用户时,所有列表也必须更新,但这可以在每晚完成。 题 我应该继续尝试这种方法,还是应该探索其他途径? 我认为SQL服务器执行速度不够快,而且会产生开销(至少如果它托管在不同的服务器上),但我的假设可能是错误的。 任何关于此事的想法或见解都表示赞赏。 我想尝试解决它而不添加太多硬件:) [更新2010-03-31] 我现在已经在以下条件下使用SQL Server 2008进行了测试。 […]

如何使用内存映射文件C#读写文件?

我在D Drive中有一个像“D:\ Image \ 1.tiff”的图像。 我想读取此文件并将其写入另一个位置,例如在路径“D:\ Project \”中。 如何使用内存映射文件执行此操作?

MemoryMappedFile不适用于2个进程?

我用MemoryMappedFile做了一个简单的测试,因为msdn说: 2个进程,1个内存映射文件: 第一个进程添加字符串“1” 第一个进程等待 第二个进程添加字符串“2”并终止 第一个进程现在读取整个内存映射文件 过程A: 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()) { […]

如何动态扩展内存映射文件

我已经使用C#来解决后续需求。 – 创建一个可以快速收集大量数据的应用程序 – 您必须能够分析收到的数据,同时还要收到更多数据。 – 使用尽可能小的CPU和光盘 我对算法的想法是…… SIZE = 10MB Create a mmf with the size of SIZE On data recived: if data can’t fit mmf: increase mmf.size by SIZE write the data to mmf – >当使用前一个“房间/空间”时,光盘上的大小增加了10MB的块。 如何在C#中“通过SIZE增加mmf.size”? 我已经找到了很多关于创建mmfs和视图的简单示例,但是我看到的唯一的地方( 链接 )实际上增加了mmfs区域的代码使用了无法编译的代码。 任何帮助都会受到很大的关注。 编辑这会导致exception: private void IncreaseFileSize() { int theNewMax = this.currentMax + INCREMENT_SIZE; this.currentMax […]