如果文件有超过 1000 个条目,将文件的内容读入 unordered_map 是不是有效
Posted
技术标签:
【中文标题】如果文件有超过 1000 个条目,将文件的内容读入 unordered_map 是不是有效【英文标题】:Is it efficient to read the contents of a file into an unordered_map if it has over 1000 entries如果文件有超过 1000 个条目,将文件的内容读入 unordered_map 是否有效 【发布时间】:2020-07-13 22:49:24 【问题描述】:我正在制作一个哈希表,它可以为我事先输入的某些值提供相当快的查找时间。我不知道该怎么做,但我的朋友说我应该制作一个文本文件,然后有一个从文本文件读取的无序映射,然后在运行它之前将值放入代码中。这有效率吗?有没有更好的方法来做到这一点?
另外请注意,这些值应该是结构。是否可以通过无序映射将它们读入代码中?
【问题讨论】:
在现代计算机上,1000 件事情基本上是零。你试过了吗?它的性能可以接受吗?听起来您在谈论 只要确保地图只在启动/首次使用时创建一次,而不是每次代码运行时。 @Axel 我该怎么做?因为我的代码包含地图初始化程序。这不会删除最初存储的内容吗? 【参考方案1】:正如 cmets 中所说,除非这些结构非常大,兆字节,否则您的想法已经足够好。
如果您有理由担心它的性能,例如如果您想支持数百万条记录或非常大的值,更复杂的方法可能会更有效。
当我只需要 64 位支持时,我有时会制作一个二进制文件,针对完整的内存映射进行优化。具体来说,一个固定大小的标头,然后是作为主索引的 (key,offset) 元组的排序数组(可以在那里使用二进制搜索,操作系统只从映射文件中获取所需的页面,并以非常激进的方式将它们缓存在 RAM 中) , 然后是索引中指定的偏移量处的值。
【讨论】:
【参考方案2】:使用 std::map 时
-
您需要有序数据。
您必须打印/访问数据(在
已排序)。您需要元素的前任/继任者。
使用 std::unordered_map 时
-
您需要保留一些数据的计数(示例 - 字符串)并且没有排序
必填。
您需要单元素访问,即没有遍历。
另外请注意,这些值应该是结构。是否可以通过无序映射将它们读入代码中?
你当然可以,但我希望你知道你不能读取带有地图fstream
的文件是为了这个目的。
【讨论】:
以上是关于如果文件有超过 1000 个条目,将文件的内容读入 unordered_map 是不是有效的主要内容,如果未能解决你的问题,请参考以下文章
根据标准从大型数据集中读取特定数据,以避免将整个文件读入内存