【问题标题】:is it better to use integer64, numeric, or character for large integer id numbers?对大整数 id 数字使用 integer64、数字或字符更好吗?
【发布时间】:2016-02-03 08:17:39
【问题描述】:

我正在处理一个数据集,该数据集包含多个表示整数 ID 号的列(例如 transactionIdaccountId)。这些 ID 号的长度通常为 12 位,这使得它们太大而无法存储为 32 位整数。

在这种情况下最好的方法是什么?

  1. 以字符串形式读取 ID。
  2. 使用 bit64 包将 ID 读取为 integer64。
  3. 将 ID 读取为数字(即双精度)。

我已被警告过使用双精度来测试相等性的危险,但我不确定在将它们用作 ID 的情况下这是否会成为问题,我可能会基于它们进行合并和过滤,但从不这样做身份证号码的算法。

从直觉上看,字符串似乎应该更慢地测试相等性并进行合并,但实际上可能并没有太大区别。

【问题讨论】:

  • 从概念上讲,这些是字符(甚至是因子变量),我会这样对待它们。使用字符键合并 data.table 非常快。

标签: r


【解决方案1】:

请参阅 Roland 对原始问题的评论。您的 ID 应该是字符向量。由于 ID 不太可能用于类似数学的运算,因此将值存储为字符向量通常更安全。他还指出,使用字符向量在 data.table 中进行合并的速度非常快。也许没有整数合并那么快,但仍然很快。在大多数情况下,这应该没问题。

【讨论】:

  • “由于 ID 不太可能用于类似数学的运算,因此将值存储为字符向量通常是安全的。”不仅安全,而且更安全,因为如果您不小心对 ID 进行了数学运算,例如 lapply(DF, median),则更容易发现错误。
【解决方案2】:

如果您追求性能,请使用 bit64。

使用“integer64”向量,您可以以 64 位为代价存储非常大的整数, 这比“int64”包中的“int64”好 7 倍。由于较小的内存占用, 原子向量架构并且仅使用 S3 而不是 S4 类,大多数操作都是一对 快三个数量级:示例加速是序列化 4 倍,添加 250 倍,900 倍 用于强制和 2000x 用于对象创建。 'integer64' 也避免了一个持续的(可能是无限的) 在存在“int64”对象期间观察到垃圾收集的惩罚(参见示例中的代码 部分)。

请参阅以下 PDF:https://cran.r-project.org/web/packages/bit64/bit64.pdf

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 2017-11-10
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多