如果我使用MapViewOfFile读取文件的一部分,如何获得文件的下一页/部分/视图?
我正在尝试使用函数的组合createFileMapping,mapviewoffile,flushviewoffile. 总缓冲区大小超过映射的视图. 示例缓冲区为50kb.映射的视图为2kb.在这种情况下, 我想使用上述功能将总缓冲区写入物理文件. 第一部分我可以写入文件.但是其余部分如何写入文件.我的意思是,如何移至下一页并编写数据的下一部分. #define MEM_UNIT_SIZE 100 - 第一个模块...内存映射创建者 GetTempPath (256, szTmpFile); GetTempFileName (szTmpFile, pName, 0, szMMFile); hFile = CreateFile (szMMFile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY,
0 2024-02-17
编程技术问答社区
从内容提供者返回一个内存映射的InputStream?
内容提供商消费者的客户端我可以做类似的事情,以获取适当的输入式以阅读图片: InputStream is = getContentResolver().openInputStream(pictureUri); 这是一个不错的API,并且将在服务器端,实际内容提供商会导致致电: public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { // Open a proper ParcelFileDescriptor, most likely using openFileHelper(uri, mode) } 但是,如果在文件系统上找不到映射到URI的图片,而是作为内存资源或即时生成的. 我可以创建一个内存映射File或InputStream,或者其他任何内容,这样我就不需要将临时文件保存到磁盘上,只是为了能够将其返回给我的内容提供商消费者? 解
0 2024-02-13
编程技术问答社区
如何在C语言中分配和释放对齐的内存
您如何分配与C中特定边界对齐的内存(例如,缓存线边界)?我正在寻找Malloc/Free类似的实现,理想情况下将尽可能便携 - 至少在32至64位体系结构之间. 编辑要添加:换句话说,我正在寻找(现在已经过时的?) memalign 函数,可以使用免费的. 解决方案 这是一个解决方案,它封装了对Malloc的调用,为对齐目的分配了更大的缓冲区,并在对齐的缓冲区之前存储原始分配的地址,以便以后呼叫以免费. . // cache line #define ALIGN 64 void *aligned_malloc(int size) { void *mem = malloc(size+ALIGN+sizeof(void*)); void **ptr = (void**)((uintptr_t)(mem+ALIGN+sizeof(void*)) & ~(ALIGN-1)); ptr[-1] = mem; return ptr; } vo
6 2024-01-24
编程技术问答社区
如何检测MemoryMappedFile是否被使用(C# .NET Core)?
我的情况类似于 a>,但足够不同的是以前的答案不起作用. 我正在生成一个PDF文件,然后告诉Windows使用用户安装的任何PDF应用程序打开该文件: new Process { StartInfo = new ProcessStartInfo(pdfFileName) { UseShellExecute = true } }.Start(); 这是针对客户的,他们已经指定了PDF文件始终具有相同的名称.问题是,如果他们用来查看PDF文件的应用程序是Microsoft Edge(对于其他应用程序也可能是正确的),则如果我尝试在用户关闭Edge之前生成第二个PDF,我会得到例外"请求的操作不能在打开用户映射部分的文件上执行." 我想创建一个有用的UI,告诉用户直到关闭第一个报告,他们才能生成第二个报告,我认为我需要非毁灭性地进行此信息,因为我想将这些信息用于在用户按下该按钮之前禁用"生成"按钮,例如,我可能可以尝试删除文件以检查
12 2024-01-08
编程技术问答社区
MemoryMappedFile.CreateFromFile总是抛出UnauthorizedAccessException。
我意识到.NET 4.0在Beta中,但我希望有人对此有解决方案.我正在尝试从DLL创建内存映射的文件: FileStream file = File.OpenRead("C:\mydll.dll"); using (MemoryMappedFile mappedFile = MemoryMappedFile.CreateFromFile(file, "PEIMAGE", 1024 * 1024, MemoryMappedFileAccess.ReadExecute)) { using (MemoryMappedViewStream viewStream = mappedFile.CreateViewStream()) { // read from the view stream } } 不幸的是,无论我做什么,我总是得到UnauthorizedAccessException, msdn文档状态: 操作系统拒绝了对文件的指定
0 2024-01-07
编程技术问答社区
c# MemoryMappedFile in .net 3.5
我需要在.NET 3.5 ...中使用MemoryMappingFile类 有什么方法可以找到.NET 4.0中使用的类的代码并在.NET 3.5中使用? 预先感谢 解决方案 如果您需要.NET 3.5中的内存映射文件,则还可以在各自的win32方法从头开始.这可能需要更多的努力,但避免了任何许可问题. 其他解决方案 .net 4使用了一个全新的CLR,我根本不会惊讶地发现在引擎盖下发生了足够的变化以使其基本上不可行. 基本上,您应该努力使用支持您需要的功能的.NET版本 - 您发现的任何解决方法很可能引起难以诊断的问题,IMO. 其他解决方案 you 可以使用empompiler或共享源(故意省略的链接)获取代码.快速外观没有向CLR显示任何呼叫,但看起来一切都是"普通" C#,并且有些p/invoke win32. 但是,请注意,您必须拉很多类才能使之成为可能,而不仅仅是system.io.memorymappedfiles.最后,您仍然可以遇到乔
10 2024-01-07
编程技术问答社区
在连接调试器的情况下,C#代码非常慢;MemoryMappedFile'的错?
我有一个客户端/服务器应用.服务器组件运行,以"远程"方式使用WCF(二进制格式化,会话对象). 如果我启动服务器组件并启动客户端,则服务器完成的第一个任务在 如果我使用附加的VS调试器启动服务器组件,然后启动客户端,任务需要20秒以上才能完成. 没有代码更改 - 没有条件汇编更改.无论我是否将服务器组件编译和运行为32位,64位,没有VS托管过程,没有VS托管过程,也会发生这种情况. 可能很重要:如果我使用vs.net profiler (采样模式),则应用程序运行的速度就像没有附加的调试器一样快速运行.所以我无法那样诊断.刚刚检查,仪器模式也很快运行.并发分析模式相同,很快工作. 关键数据: 该应用程序使用相当重的多线程(标准线程池中的40个线程).无论如何,创建线程都会很快发生,这不是一个慢点.有很多锁,WaitHandle s和Monitor模式 该应用程序完全没有例外. 该应用不会创建控制台输出. 该应用程序完全是管理代码. 该应用程序确
2 2024-01-07
编程技术问答社区
我可以得到一个内存映射文件的路径吗?(.NET 4.0)
我希望一个non-.net应用程序访问一个内存映射的文件,,但是此应用程序不知道内存映射的文件的存在,因此我需要文件路径.有可能的? 解决方案 他们有一些样本在这里P> 编辑 我认为其他解决方案 您可以使用这是一个示例,显示了如何从内存映射文件中获取文件名: using Microsoft.Win32.SafeHandles; using System; using System.ComponentModel; using System.Diagnostics; using System.IO.MemoryMappedFiles; using System.Runtime.InteropServices; using System.Text; namespace MMFilePathTest { static class Program { private static MemoryMappedFile GetMappedPhys
4 2024-01-07
编程技术问答社区
.NET 4.0内存映射文件的性能
我想知道是否有人尝试过新的.NET 4.0内存映射的文件功能? 我知道它们像OS一样古老,但是在.NET中进行的本地处理是新的. 是否有人能够测试并说出有关性能的措施? 我对访问二进制文件的随机部分,写入速度等的时间非常感兴趣.同样对本地Winapi MMF的性能差异也很不错. 谢谢! 解决方案 内存映射的.NET 4.0中的文件(在新的System.IO.MemoryMappedFiles命名空间中)只需包装WIN32 API即可存储映射的文件. 这意味着它们尽可能快.这是用于将.NET组件加载到内存中的相同机制. 在实际的时序数方面,这将取决于32位与64位,您拥有多少内存,文件有多大,访问模式以及在很大程度上是物理磁盘硬件的类型. ref:其他解决方案 在以下问题中,我对内存图映射的文件进行了性能测试与标准IO: 使用内存映射文件的缺点 我找不到出于我的目的而找到的大缺点,对于内存映射的文件而言,性能速度更快约4倍,在问题中,您可以找
2 2024-01-07
编程技术问答社区
内存映射文件对两个进程不起作用?
我已经使用MemoryMappedFile进行了一个简单的测试/a>说: 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()) {
4 2024-01-07
编程技术问答社区
如何动态扩展一个内存映射的文件
我已经使用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 - >使用先前的"房间/空间"时,光盘上的大小会增加. . 在C#中如何完成"增加MMF.Size尺寸"?我发现了许多有关创建MMF和视图的简单示例-net-40.htm" rel =" noreferrer"> link )我看到了代码,这些代码会使用无法编译的代码,从而添加了MMFS区域.任何帮助都将被大大应用. 编辑 这导致例外: private void IncreaseFileSize() { i
0 2024-01-07
编程技术问答社区
使用MemoryMappedFile和FileSystemWatcher来检测日志文件的新条目
我有一个由第三方应用程序撰写的日志文件,我希望我的申请在真实/近时间"读取"该日志文件,解析新的日志条目并对某些事件采取行动. 我的想法是,我可以通过FileSystemWatcher(以发出信号文件更改)和Memory映射文件(继续从某个偏移量进行读数)来实现此目标. 但是,由于这是我第一次使用MemoryMappedFiles,因此我确实遇到了一些问题,这些问题可能是由于无法正确理解概念而引起的(例如,我无法打开现有文件,因为它在其他过程中正在使用时). 我想知道某人是否有一个示例说明如何使用Memory映射文件读取另一个过程锁定的文件? 谢谢, 汤姆 编辑: 从评论中,似乎内存映射的文件无法帮助我访问具有独家锁定的文件.但是,"尾巴"工具,例如Baretail(http://www.baremetalsoft.com/baretail/index.php)可以做到这一点.阅读该文件,该文件以1S间隔从另一个应用程序中获得独家锁定).因此,必
0 2024-01-07
编程技术问答社区
在F#中从二进制文件的特定位置读取整数的性能问题
今天早上,我问在这里为什么我的python代码比我的f#版本慢得多,但我想知道是否可以更快地制作f#版本.有什么想法我如何创建以下代码的更快版本,该版本从带有32位整数的二进制文件中读取唯一索引的列表?请注意,我尝试了两种方法,一种基于二进制阅读器,另一个基于MemoryMappedFile(module SimpleRead let readValue (reader:BinaryReader) cellIndex = // set stream to correct location reader.BaseStream.Position None | v -> Some(v) let readValues fileName indices = use reader = new BinaryReader(File.Open(fileName, FileMo
2 2024-01-06
编程技术问答社区
读取内存映射文件或内存映射视图访问器的所有内容而不知道它的大小
我需要类似的内容来读取或readallBytes来使用mappedviewAccessor读取内存映射文件的所有内容,如果我不知道它的大小,我该怎么做? 我已经搜索过它,我已经看到了这个问题,但这不是我正在寻找的东西: 快速从.NET中的内存映射文件读取字节? 编辑: 存在问题,(int)流.长度没有给我正确的长度,而是给出了使用的内部缓冲区的大小!我需要刷新这个问题,因为它非常紧迫. 解决方案 宁愿使用流: public static Byte[] ReadMMFAllBytes(string fileName) { using (var mmf = MemoryMappedFile.OpenExisting(fileName)) { using (var stream = mmf.CreateViewStream()) { using (BinaryReader binRea
8 2024-01-03
编程技术问答社区
如何扫描磁盘上真正巨大的文件?
考虑磁盘上的一个非常大的文件(也许超过4GB),我想通过此文件进行扫描并计算特定二进制模式的时间. 我的想法是: 使用内存映射文件(CreateFileMap 或Boost mapped_file)加载 文件到虚拟内存. 对于每个100MB映射的记忆,创建一个线程以扫描并计算结果. 这是可行的吗?有什么更好的方法吗? 更新: 内存映射的文件将是一个不错的选择,因为可以在11S内处理1.6GB文件. . 谢谢. 解决方案 多线程仅会使此操作速度较慢,除非您想在其他硬盘驱动器上扫描多个文件.否则您将要寻找. 我使用内存映射的文件编写了一个简单的测试功能,其中一个线程1.4 GB文件花了大约20秒钟的时间来扫描.有两个线程,每个线程都将一半的文件(甚至是1MB块到一个线程,奇怪的),它花费了80多秒. 1线程:20015毫秒 2个线程:83985毫秒 是的,2个线程比1个线程慢了 ! 这是我使用的代码,这是单线版本,我使
8 2024-01-03
编程技术问答社区
如何在.NET中快速读取内存映射文件的字节数?
在某些情况下,MemoryMappedViewAccessor类并不能有效地读取字节.我们得到的最好的是通用ReadArray它是所有结构的路线,涉及几个不必要的步骤. . 可以使用MemoryMappedViewStream,但是由于它基于Stream,因此您需要先寻求正确的位置,然后读取操作本身具有更多不必要的步骤. 是否有一种快速,高性能的方法可以从.NET中的存储器映射文件中读取一系列字节,因为它应该是地址空间的特定区域,可以从? 读取? 解决方案 此解决方案需要不安全的代码(使用/unsafe开关编译),但直接抓取指向内存的指针;然后Marshal.Copy可以使用.这比.NET框架提供的方法要快得多. // assumes part of a class where _view is a MemoryMappedViewAccessor object public unsafe byte[] ReadBytes(int
4 2024-01-03
编程技术问答社区
内存映射的文件.NET
我有一个项目,它需要在ASP.NET中访问大量专有数据.这是通过将数据加载到共享存储器中的Linux/PHP上完成的.我想知道尝试使用内存映射的文件是否是需要的方式,或者有更好的.NET支持有更好的方法.我正在考虑使用数据缓存,但不确定所有保存在缓存中的数据大小的陷阱. 解决方案 我知道这有点晚了,但是.NET 4.0框架现在支持框外的内存映射文件: http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-files-files-inet-4.aspx 其他解决方案 如果您正在寻找C#的内存映射库,请窥视 tomas Restrepo的Filemap 包装器.它已在LGPL下获得许可. 其他解决方案 当您拥有大量数据时,可以使用内存映射的文件,并且不想在过程边界范围内征收该文件的成本.我也将其用于类似目的.您需要在.NET中对不安全和固定的内存
4 2024-01-02
编程技术问答社区
将流的编码改为UTF-8(MemoryMappedViewStream)。
我正在使用下面的代码尽可能快地读取〜2.5GB XML文件(感谢MemoryMappingFile).但是,我得到以下例外:" '.',十六进制值0x00,是无效的字符.第9778行,位置73249406.".我相信这是由于一些编码问题.如何确保使用UTF-8读取文件? static void Main(string[] args) { using (var file = MemoryMappedFile.CreateFromFile(@"d:\temp\temp.xml", FileMode.Open, "MyMemMapFile")) { using (MemoryMappedViewStream stream = file.CreateViewStream()) { Read(stream); } } } static void Read(Stream stream) {
16 2023-12-23
编程技术问答社区
使用共享的IPC并作为全局的MMF
使用MMF和C#I在两个过程之间创建共享内存. 我的目的是将其创建为全局4000字节长度并创建分区 因此,Main Proj是" MainProj"将启动名为"$AppName$_sharedMMF" 的MMF 然后" 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
0 2023-12-14
编程技术问答社区
C# UWP Windows 10 进程间通信与MemoryMappedFiles丢失
我正在面临一个新问题,这是在为我的应用编码IPC时发生的. 在UWP之前,我能够成功使用指令using System.IO.MemoryMappedFiles;.现在我不能使用using System.IO.MemoryMappedFiles;,我需要它. 每个人都面临同一问题吗?如果是,您如何解决它? 我的应用不再编译了. 我已经尝试将System.Core.dll作为参考重新插入,并且使用Dllimport,都没有工作. 解决方案 通用应用程序中没有直接过程间通信. 您可以使用 app services服务 href =" https://msdn.microsoft.com/en-us/library/windows/papps/mt269386.aspx" rel =" noreferrer"> laininguriforresultsasync 执行跨越多个应用的​​任务. 其他解决方案 添加了MemoryMappedFiles i
6 2023-12-10
编程技术问答社区