我编写了一个 c++ prog 来查询一个 100 GB 的字典。我已将字典拆分为 n 个大小相等的文件。所有拆分文件都放在同一个目录中。字典是完全索引的,即,一旦有查询,我就知道要打开哪个 spit 文件以及在哪里寻找。我的问题是为了更好的性能,哪个拆分会更好:(a)少量大文件或(b)大量小文件?另外,理想的分裂是什么?
问问题
674 次
2 回答
1
您的字典是静态的还是可以在运行时更改?
如果它是静态的,则对所有内容使用单个文件。
如果它是动态的并且您的索引是“向量”(不是最好的主意),请为数据使用一个文件,为每个索引使用一个文件。
如果它是动态的并且您的索引是“树”(包括非 100% 连续的双端队列和其他向量(如 ADT)),您可以再次使用单个文件,除非出于速度考虑将索引存储在单独的卷上有意义。
您应该在开始时打开文件,并且不再受到文件打开/关闭的惩罚。
如果您的应用程序是 64 位的,只需将整个文件映射到内存中,然后让操作系统完成其余的工作。
如果您的应用程序是 32 位的,仍然使用内存映射来访问文件。您需要为可能需要执行的每个可能的并发访问创建一个内存映射“窗口”(对于静态数据,可能每个数据线程一个,每个索引每个线程一个或两个)。
于 2012-09-21T01:00:28.703 回答
0
我认为这个问题没有直接的答案。只有实验才能告诉你。打开文件进行读取的成本应该是恒定的,无论大小如何,读取文件的内容当然取决于文件大小。
还有其他提示,尽管我假设当您收到查询时,您打开文件,完全解析/读取它,或者直到找到单词然后关闭文件并返回结果,在这种情况下,有许多增强功能要做,也许你有,也许没有,但这里有
- 如果您收到大量查询,打开文件可能会很昂贵,在这种情况下,您可能需要缓存文件或搜索查询以获得更好的性能
- 当您打开一个文件并读取它时,您是按顺序执行的,这意味着文件或多或少地被加载到内存中,我曾经遇到过一个用于 java 的 sax xml 解析器,它只能加载所需的将 xml 块放入内存,用于处理非常大的 xml 文件,也许 c++ 有类似的东西。SAX 项目
一种完全不同的方法是使用带有索引的数据库。这个问题你不必处理文件打开问题
于 2012-09-20T22:32:29.153 回答