提供对非常大(50GB +)ASCII文件的随机读访问

时间:2013-03-14 21:16:27

标签: c# io bigdata memory-mapped-files

我的任务是以C#控制台应用程序的形式提供对非常大的(50GB +)ASCII文本文件(在第n行中处理第n行/第n个单词的请求)的随机读取访问。

谷歌搜索和阅读几天后,我已经实现了这样的愿景: 由于 StreamReader 擅长顺序访问,因此使用它来构建文件(List<List<long>> map中的行/单词索引,其中map[i][j]是第i行的第j个单词开头的位置)。然后使用索引通过MemoryMappedFile访问文件,因为它擅长提供随机访问。

解决方案中是否存在明显的缺陷?它对于给定的任务是否是最佳的?

UPD :它将在64位系统上执行。

2 个答案:

答案 0 :(得分:5)

看起来很好,但是如果你正在使用MemoryMapping,那么你的程序只能在64位系统上运行,因为你超出了有效的2GB地址空间。

你可以使用FileStream并调用.Seek()来适当跳转到选定的偏移量,所以我认为不需要使用MemoryMapped文件。

答案 1 :(得分:2)

我相信你的解决方案是一个好的开始 - 即使你的List容器不是最好的Map容器​​ - 列表读取任意元素的速度很慢。

我会测试在内存/速度权衡方面做List<List<long>>映射是否最好 - 因为操作系统在页面边界缓存内存映射(x86 / x64上为4096字节),实际上它可能更快看起来更快up up每行开头的地址,然后扫描该行寻找单词。

显然,这种方法只能在64位操作系统上运行,但MMap的性能优势非常明显 - 这是少数几个对64位非常重要的地方之一 - 数据库应用程序:)