gpt4 book ai didi

python - 在 python 中从 R data.table 访问数据的推荐方法是什么?我可以避免将数据写入光盘吗?

转载 作者:行者123 更新时间:2023-12-03 15:10:42 27 4
gpt4 key购买 nike

是否有一些推荐的方法可以将数据从 R(以 data.table 的形式)传递到 Python,而无需将数据保存到磁盘?我知道我可以通过 reticulate 使用 R 中的 python 模块(我想同样的事情可以在另一边使用 rpy2 ),但从我读到的内容来看,这会损害库的整体性能,因此很有可能最好将其存储到光盘我的 r data.table并使用 python 从磁盘读取相同的数据并运行,例如,lightgbm ,而不是尝试运行 lightgbm使用 reticulatedata.table使用 rpy2。
为什么我不坚持使用 R 或 Python :
我更喜欢使用 r data.table (相对于 Pandas )用于我的数据操作,因为它速度更快,内存效率更高,并且有很多我喜欢的功能,例如不等式连接、滚动连接、笛卡尔连接,以及非常简单的熔化和类型转换.每当我问 data.table 时,我也喜欢这样。堆栈溢出中的相关问题,我很快就得到了高质量的答案,而对于 Pandas我还没有那么成功。但是,有些任务我更喜欢 python,例如梯度提升或神经网络。

最佳答案

没有推荐的方法。
理论上,您必须将 R data.frame 转储到磁盘并在 python 中读取它。
在实践中(假设是生产级操作系统),您可以使用“RAM 磁盘”位置 /dev/shm/因此,您基本上将数据写入驻留在 RAM 内存中的文件,然后直接从 RAM 中读取,而无需将数据转储到磁盘内存。
示例用法:

fwrite(iris, "/dev/shm/data.csv")
d = fread("/dev/shm/data.csv")
unlink("/dev/shm/data.csv")
至于格式,您有以下选择:
  • csv - 通用便携格式
  • data.tablefwrite功能超快,可生成可移植的 csv 数据文件。请务必使用 setDTthreads(0L) 启用所有 cpu 线程使用前 fwrite在多核机器上。
    然后在 python 中你需要读取 csv 文件,其中 python datatable模块会非常快,然后,如果需要,可以使用 x.to_pandas() 将对象转换为 python pandas .
  • feather - “可移植”二进制格式

  • 另一种选择是使用 R 的 arrow封装和功能 write_feather , 然后在 python 中使用 pyarrow 读取数据模块和 read_feather .
    在大多数情况下,这种格式应该比 csv 快,请参阅下面的时间安排。在写入数据的情况下,差异可能不会那么大,但在大多数情况下读取数据会快得多,尤其是在读取 R 中的许多字符变量时(尽管这不是您的用例,因为您在 python 中读取)。另一方面,它还不是真正可移植的(见 apache/arrow#8732)。此外,如果最终发布新版本 3,那么使用当前 Feather 保存的文件可能不再兼容。
  • fst - 快速二进制格式
  • fst可以用作 Feather 格式的更快替代方案,但尚无法在 python 中读取 fst 数据,因此该方法目前无法用于解决您的问题。您可以在 https://github.com/fstpackage/fst/issues/184 中跟踪此 FR 的进度。当问题得到解决时,它可能会以最快的方式解决您的问题。

    使用以下脚本
    library(data.table)
    setDTthreads(0L) ## 40

    N = 1e8L
    x = setDT(lapply(1:10, function(...) sample.int(N)))
    system.time(arrow::write_feather(x, "/dev/shm/data.feather"))
    system.time(fwrite(x, "/dev/shm/data.csv", showProgress=FALSE))
    rm(x)
    ## run python

    unlink(paste0("/dev/shm/data.",c("csv","feather")))
    N = 1e8L
    x = setDT(lapply(1:10, function(...) runif(N)))
    system.time(arrow::write_feather(x, "/dev/shm/data.feather"))
    system.time(fwrite(x, "/dev/shm/data.csv", showProgress=FALSE))
    rm(x)
    ## run python

    unlink(paste0("/dev/shm/data.",c("csv","feather")))
    N = 1e7L
    x = setDT(lapply(1:10, function(...) paste0("id",sample.int(N))))
    system.time(arrow::write_feather(x, "/dev/shm/data.feather"))
    system.time(fwrite(x, "/dev/shm/data.csv", showProgress=FALSE))
    rm(x)
    ## run python

    unlink(paste0("/dev/shm/data.",c("csv","feather")))
    import datatable as dt
    import timeit
    import gc
    from pyarrow import feather

    gc.collect()
    t_start = timeit.default_timer()
    x = dt.fread("/dev/shm/data.csv")
    print(timeit.default_timer() - t_start, flush=True)
    gc.collect()
    t_start = timeit.default_timer()
    y = x.to_pandas()
    print(timeit.default_timer() - t_start, flush=True)
    del x, y

    gc.collect()
    t_start = timeit.default_timer()
    x = feather.read_feather("/dev/shm/data.feather", memory_map=False)
    print(timeit.default_timer() - t_start, flush=True)
    del x
    我得到了以下时间:
  • 整数:
  • 写:feather 2.7s vs csv 5.7s
  • 阅读: Feather 2.8s 与 csv 111s+3s

  • 双倍的:
  • 写:feather 5.7s vs csv 10.8s
  • 阅读: Feather 5.1s 与 csv 180s+4.9s

  • 特点:
  • 写:feather 50.2s vs csv 2.8s
  • 阅读: Feather 35s 与 csv 14s+16s


  • 根据提供的数据案例(int/double 1e8 行,字符 1e7 行;10 列:int/double/character),我们可以得出以下结论:
  • csv 写入 int 和 double 的速度比 Feather
  • 慢 2 倍左右
  • csv 的书写字符比 Feather 快 20 倍左右
  • csv 读取 int 和 double 的速度比 Feather
  • 慢得多
  • 从 python 数据表到 pandas 的转换 int 和 double 相对便宜
  • csv 读取字符的速度比 Feather 快 2 倍左右
  • 从 python 数据表到 pandas 的转换字符很昂贵

  • 请注意,这些是非常基本的数据案例,请务必检查您的实际数据的时间。

    关于python - 在 python 中从 R data.table 访问数据的推荐方法是什么?我可以避免将数据写入光盘吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63466010/

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