<分区>
我编写了一个 C++ 程序来查询 100 GB 的字典。我已将字典拆分为 n 个大小相等的文件。所有拆分文件都放在同一个目录中。字典是完全索引的,即,一旦出现查询,我就知道要打开哪个 spit-file 以及到哪里寻找。我的问题是为了获得更好的性能,哪种拆分会更好: (a) 少量大文件或 (b) 大量小文件? 另外,什么是理想的分割?
<分区>
我编写了一个 C++ 程序来查询 100 GB 的字典。我已将字典拆分为 n 个大小相等的文件。所有拆分文件都放在同一个目录中。字典是完全索引的,即,一旦出现查询,我就知道要打开哪个 spit-file 以及到哪里寻找。我的问题是为了获得更好的性能,哪种拆分会更好: (a) 少量大文件或 (b) 大量小文件? 另外,什么是理想的分割?
最佳答案
您的字典是静态的还是可以在运行时更改?
如果它是静态的,则对所有内容使用单个文件。
如果它是动态的并且您的索引是“vector ”(不是最好的主意),请使用一个文件存储数据,并为每个索引使用一个文件。
如果它是动态的并且您的索引是“树”(包括双端队列和其他 vector ,如 ADT,它们不是 100% 连续的)您可以再次使用单个文件,除非为了速度而将索引存储在单独的卷上.
您应该在开头打开文件,并且永远不会再招致文件打开/关闭惩罚。
如果您的应用程序是 64 位的,只需将整个文件映射到内存中,让操作系统完成其余的工作。
如果您的应用程序是 32 位的,仍然使用内存映射来访问文件。您需要为您可能需要执行的每个可能的并发访问创建一个内存映射“窗口”(对于静态数据,可能每个数据线程一个,每个索引每个线程一个或两个)。
关于c++:更多的小文件还是更少的大文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521725/