1

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

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

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

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

4

2 回答 2

5

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

只需使用 aFileStream和调用.Seek()来适当地跳转到选定的偏移量就可以了,所以我认为不需要使用 MemoryMapped 文件。

于 2013-03-14T21:20:38.777 回答
2

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

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

显然,这种方法仅适用于 64 位操作系统,但 MMap 的性能优势非常显着 - 这是使用 64 位非常重要的少数几个地方之一 - 数据库应用程序 :)

于 2013-03-14T21:22:32.790 回答