提问人:Zach 提问时间:10/25/2023 更新时间:10/26/2023 访问量:71
在 R 或 python 中将 40 亿个十六进制整数转换为十进制整数的有效方法
Efficient way to convert 4 billion hex integers to decimal integer in R or python
问:
我有一个大约有 44 亿行的 csv 文件。它有 25 个分类列,所有列都是十六进制编码的整数,例如 和 。EE6B2800
10642AC00
我有一台具有 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 中是否有一个好的库可以快速、高效地对字符串值进行整数哈希处理?我可以用十六进制值做一些聪明的事情吗?
答:
我的第一反应是:为什么?你可以用十进制值做什么,而你不能用十六进制值做什么?例如,请参阅包。gmp
as.bigz('0xffee45454545')
Big Integer ('bigz') :
[1] 281398829466949
FWIW,我的包会很乐意将任意大的十六进制值转换为整数(包)并返回。bigBits
bigz
gmp
但是,您可能希望修改任何现有算法,因为该算法专门设计用于将字符串映射到(小)整数,作为无损压缩的一部分。zip
评论
djb2
hrbrmiscpp::djb2_hash
match(x, x)
as.integer(factor(x))
factor()
match(x, x)
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))