gpt4 book ai didi

r - pivot_longer 在小对象上运行的内存使用情况

转载 作者:行者123 更新时间:2023-12-05 03:34:57 26 4
gpt4 key购买 nike

我正在处理一个包含 528 列和 2,643,246 行的数据框。其中八个是字符变量,其余是整数。总共有 11.35 GiB 的数据,我的可用 RAM 为 164 GiB。

我现在想在所述数据框上运行一个 pivot_longer,每列一行 + 两个 ID 变量(年份和机构)。 76年以上机构总数671370所。所以 atm 数据的结构如下:

<表类="s-表"><头>机构年<日>X <日>是 <日>Z <正文>一个1213一个2344B1342B2532

我想改变它的地方,使结构变成:

<表类="s-表"><头>机构年G<日>N <正文>一个1X2一个1是1一个1Z3一个2X3一个2是1一个2Z4B1X3B1是4B1Z2B2X5B2是3B2Z2

为此,我尝试了以下代码:

library(tidyverse)
Df <- Df %>% pivot_longer(17:527,
names_to = "G",
values_to = "N"
)

在小样本数据上运行此程序时,我设法获得了预期的结果,但是在尝试对整个数据集执行相同操作时,我很快就耗尽了内存。从使用 11 GiB 内存的对象开始,它迅速增加到 150 GiB 以上,然后返回“无法分配大小为 x Gb 的向量”错误。

因为我没有添加任何数据,所以我不太明白额外的内存使用是从哪里来的。因此,我想知道是什么造成了这种增加,以及是否有更有效的方法通过其他一些代码来解决这个问题。在此先感谢您的帮助!

最佳答案

对于这种大小的数据,reshape2data.table 的旋转可能比 tidyr 的更节省内存。在较小的 800MB 样本中,reshape2::melt 需要的内存大约是原始数据的 2.6 倍,data.table::melt 需要大约 3.6 倍,而tidyr::pivot_longer 方法在这种情况下需要大约 12 倍的内存,并且速度大约慢 20 倍。

编辑:在查看警告后,我意识到当我调用 data.table::melt 时,我的早期草稿实际上在幕后使用了 reshape2,因为我正在喂它小东西。添加了显式 data.table::melt 解决方案,其中包括将数据转换为 data.table。对于此数据,reshape2::melt 似乎速度更快且内存效率更高。

示例数据

n1 = as.integer(2E8/26)
set.seed(42)
data_long <- data.frame(Institution = 1:n1,
G = rep(letters, each = n1),
Z = rpois(26*n1, 10))
data_wide <- data_long %>% pivot_wider(names_from = G, values_from = Z)

基准

bench::mark(
tidyr::pivot_longer(data_wide, -1),
reshape2::melt(data_wide, id.vars = 1),
data.table::melt(data.table::as.data.table(data_wide), id.vars = 1),
check = FALSE,
iterations = 10
)

# A tibble: 3 x 13
expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time
<bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm>
1 tidyr::pivot_longer(data_wide, -1) 26.77s 37.38s 0.0269 10.52GB 0.0538 10 20 6.2m
2 reshape2::melt(data_wide, id.vars = 1) 1.25s 1.73s 0.519 2.23GB 0.156 10 3 19.3s
3 data.table::melt(data.table::as.data.table(data_wide), id.vars = 1) 1.82s 2.41s 0.332 3.01GB 0.232 10 7 30.1s
# … with 4 more variables: result <list>, memory <list>, time <list>, gc <list>

关于r - pivot_longer 在小对象上运行的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70022385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com