我有较大的CT原始数据文件,最大可能超过20到30GB。对于该部门中当前的大多数计算机,我们最多只能使用3GB。但是,为了处理数据,我们需要遍历所有可用数据。当然,我们可以通过依次通过读取和写入功能遍历数据来做到这一点。但是有时有必要将一些数据保留在内存中。
当前,我有自己的内存管理,在其中创建了一个所谓的MappableObject。每个原始数据文件都包含20000个结构,每个结构均显示不同的数据。每个MappableObject都引用文件中的一个位置。
在C#中,我创建了某种程度上可以正常工作的机制,该机制会在必要时自动对数据进行mp和取消映射。从几年前我就知道MemoryMappedFiles,但是在.NET 3.5中,我拒绝使用它,因为我知道在.NET 4.0中,它可以在本地使用。
因此,今天我尝试了MemoryMappedFiles,发现不可能分配需要的内存。如果我有32位系统,而我想分配20GB,则由于超出逻辑地址空间的大小,因此无法使用。这对我来说很清楚。
但是,有没有办法处理像我这样的大文件?我还有其他机会吗?你们如何解决这些问题?
谢谢
马丁
最佳答案
“内存映射”,您不能将20 GB的内存映射到2 GB的虚拟地址空间。在32位操作系统上获得500 MB的内存非常棘手。请注意,除非您需要对文件数据进行大量随机访问,否则这不是一个好的解决方案。当您必须对 View 进行分区时,这应该很困难。通过常规文件进行的顺序访问在内存使用量非常适中的情况下是无与伦比的。同样要当心从MMF编码(marshal)数据的费用,您仍在支付托管结构的副本或编码(marshal)的费用。
关于c# - MemoryMappedFiles : How much memory can be allocated for files,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5518084/