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

本文关键字:ASCII 文件 读访问 随机 以上 50GB 非常 | 更新日期: 2023-09-27 18:03:53

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

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

解决方案中是否存在一些明显的缺陷?对于给定的任务来说,它是最优的吗?

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

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

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

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

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

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

显然,这种方法只适用于64位操作系统,但是MMap的性能优势是显著的——这是少数几个使用64位的地方之一——数据库应用程序:)