如果文件有超过 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 是不是有效的主要内容,如果未能解决你的问题,请参考以下文章

根据标准从大型数据集中读取特定数据,以避免将整个文件读入内存

将海量 CSV 文件读入 Oracle 表

如何处理 bash 脚本读取的 CSV 文件中的逗号

如何在不使用databricks csv api的情况下直接将CSV文件读入spark DataFrame?

ftp上传后自动添加数据库条目

将字符串从文件中读入 1 个字符串,而不是整数 c++