在 R 或 python 中将 40 亿个十六进制整数转换为十进制整数的有效方法

Efficient way to convert 4 billion hex integers to decimal integer in R or python

提问人:Zach 提问时间:10/25/2023 更新时间:10/26/2023 访问量:71

问:

我有一个大约有 44 亿行的 csv 文件。它有 25 个分类列,所有列都是十六进制编码的整数,例如 和 。EE6B280010642AC00

我有一台具有 3TB RAM 的机器,用于加载数据集。R 将这些值读取为字符串(我很乐意使用 pandas 代替)。我想将这些字符串转换为整数。data.table::fread

一种方法是将十六进制值解码为 64 位整数,例如:

  • “10642AC00” —> 4000000000
  • “EE6B2800” —> 4400000000

这种方法的一个问题是我不能用原始字符串来做。 有效,但我无法弄清楚如何转换我拥有的字符串。另一个问题是 R 中的所有内容都不支持 64 位整数,我真的宁愿拥有 32 位整数。bit64::as.integer64(c(0x10642AC00, 0xEE6B2800))

另一种方法是将每个唯一值转换为顺序整数。例如

  • “10642AC00” —> 1
  • “EE6B2800”——> 2

我可以用 来做到这一点,它有效但速度很慢。我已经跑了一天半了,它仍然在第一列中咕噜咕噜地跑。我不知道这是否会每次完成,或者它是否会炸毁我机器上的 RAM。as.integer(factor(c("10642AC00", "EE6B2800")))

有没有更快的方法可以做这样的事情?我很高兴得到一个近似的输出,例如,有时整数之间有一些间隙,或者有时不同的十六进制值最终会变成同一个整数。as.integer(factor(c("10642AC00", "EE6B2800")))

我的主要要求是我想要 32 位整数,它主要(但不一定完美地)将 1 对 1 映射到原始十六进制字符串。有没有更快、更有效的方法来做这样的事情?我对每列需要数小时的操作感到满意,但不希望每列需要数天的操作。

R 中是否有一个好的库可以快速、高效地对字符串值进行整数哈希处理?我可以用十六进制值做一些聪明的事情吗?

python r data.table 分类数据

评论

0赞 Seth 10/26/2023
在这种情况下,该算法可能适用于字符串哈希。提供快速实现:。djb2hrbrmiscpp::djb2_hash
2赞 Gregor Thomas 10/26/2023
我对 1M 值进行了试验,比 快 25 倍左右。 在内部按字母顺序对唯一值进行排序,而将按出现顺序进行排序,因此它可能在较大的数据上表现更好(相对)。match(x, x)as.integer(factor(x))factor()match(x, x)
0赞 Zach 10/26/2023
match 不需要第二个参数是唯一的吗?
2赞 r2evans 10/26/2023
@Zach,不,它不会,它将与第二个参数中每个重复值的第一个位置匹配。尝试进行演示。match(1:4, c(1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4))
0赞 Zach 10/26/2023
太棒了,谢谢

答:

2赞 Carl Witthoft 10/26/2023 #1

我的第一反应是:为什么?你可以用十进制值做什么,而你不能用十六进制值做什么?例如,请参阅包。gmp

as.bigz('0xffee45454545')
Big Integer ('bigz') :
[1] 281398829466949

FWIW,我的包会很乐意将任意大的十六进制值转换为整数(包)并返回。bigBitsbigzgmp

但是,您可能希望修改任何现有算法,因为该算法专门设计用于将字符串映射到(小)整数,作为无损压缩的一部分。zip

评论

1赞 Gregor Thomas 10/26/2023
为什么是一个很好的观点。这有XY问题的气味。
0赞 Zach 10/26/2023
这是一个愚蠢的问题,但是如何转换字符串“EE6B2800”?我需要将魔术值“0x”粘贴到所有字符串的前面吗?
1赞 Carl Witthoft 10/26/2023
@zach试试看!