gpt4 book ai didi

r - 使用 vroom 在 R 中部分读取非常大的 csv.gz

转载 作者:行者123 更新时间:2023-12-04 11:29:28 28 4
gpt4 key购买 nike

我有一个 csv.gz 文件(据我所知)压缩前的大小为 70GB。我的机器有 50GB 的 RAM,所以无论如何我永远无法在 R 中打开它。
例如,我可以按如下方式加载前 10m 行:

library(vroom)

df <- vroom("HUGE.csv.gz", delim= ",", n_max = 10^7)
对于我必须做的事情,可以一次加载 10m 行,执行我的操作,然后继续接下来的 10m 行。我可以循环执行此操作。
因此,我正在尝试 skip争论。
df <- vroom("HUGE.csv.gz", delim= ",", n_max = 10^7, skip = 10^7)
这会导致错误:
Error: The size of the connection buffer (131072) was not large enough
to fit a complete line:
* Increase it by setting `Sys.setenv("VROOM_CONNECTION_SIZE")`
我用 Sys.setenv("VROOM_CONNECTION_SIZE" = 131072*1000) 增加了这个,但是,错误仍然存​​在。
这个问题有方法解决吗?
编辑:我发现随机访问 gzip 压缩的 csv (csv.gz) 是不可能的。我们必须从头开始。可能最简单的方法是解压并保存,然后跳过就可以了。

最佳答案

我一直无法弄清楚vroom非常大的超过 RAM(gzipped)csv 文件的解决方案。但是,以下方法对我来说效果很好,我很高兴了解具有更好查询速度同时还节省磁盘空间的方法。

  • 使用 split xsv 中的子命令来自 https://github.com/BurntSushi/xsv将大型 csv 文件拆分为 舒适的内存块 比如说,10^5 行并将它们保存在一个文件夹中。
  • 使用 data.table::fread 读取所有块使用 for 一对一(以避免低内存错误)循环并将它们全部保存到一个文件夹中作为压缩文件 parquet文件使用 arrow节省空间并准备大表以进行快速查询的包。对于更快的操作,建议重新保存 parquet文件 分区 通过您需要经常过滤的字段。
  • 现在您可以使用 arrow::open_dataset并使用 dplyr 查询该多文件 Parquet 文件夹命令。根据我的经验,它占用最少的磁盘空间并提供最快的结果。

  • 我用 data.table::fread明确定义每个字段的列类,以最快和最可靠地解析 csv 文件。 readr::read_csv也一直准确但速度较慢。但是,通过 read_csv 自动分配列类以及您可以通过 read_csv 自定义列类的方式实际上是最好的 - 所以更少的人工时间但更多的机器时间 - 这意味着它可能会根据场景整体更快。其他 csv 解析器为我使用的那种 csv 文件抛出了错误并浪费了时间。
    您现在可以删除包含分块 csv 文件的文件夹以节省空间,除非您想尝试使用其他 csv 解析器循环读取它们。
    其他以前成功的方法:循环读取上述所有 csv 块并将它们保存到:
  • 使用 disk.frame 的文件夹包裹。然后可以使用 dplyr 查询该文件夹或 data.table文档中解释的命令。它具有保存压缩文件的功能 fst节省空间的文件,虽然不如 parquet文件。
  • DuckDB 中的表允许使用 SQL 查询的数据库或 dplyr命令。使用数据库表方法不会节省您的磁盘空间。但是DuckDB还允许使用 SQL 查询分区/未分区的 Parquet 文件(节省磁盘空间)命令。

  • 编辑: - 下面的改进方法
    我进行了一些实验,发现了一种更好的方法来执行上述操作。使用下面的代码,大型(压缩)csv 文件将在 R 环境中自动分块(无需使用任何外部工具,如 xsv),并且所有块都将写入 parquet准备好查询的文件夹中的格式。
    library(readr)
    library(arrow)

    fyl <- "...path_to_big_data_file.csv.gz"
    pqFolder <- "...path_to_folder_where_chunked_parquet_files_are_to_be_saved"

    f <- function(x, pos){
    write_parquet(x,
    file.path(pqFolder, paste0(pos, ".parquet")),
    compression = "gzip",
    compression_level = 9)
    }

    read_csv_chunked(
    fyl,
    col_types = list(Column1="f", Column2="c", Column3="T", ...), # all column specifications
    callback = SideEffectChunkCallback$new(f),
    chunk_size = 10^6)
    如果,而不是 parquet ,你想使用 -
  • disk.frame ,回调函数可用于创建分块压缩 fst dplyr 的文件或 data.table样式查询。
  • DuckDB ,回调函数可用于append将块放入 SQL 的数据库表中或 dplyr样式查询。

  • 通过明智地选择 chunk_size readr::read_csv_chunked 的参数命令,计算机在运行查询时不应耗尽 RAM。
    PS:我用 gzip压缩 parquet文件,因为它们可以用 ParquetViewer 预览来自 https://github.com/mukunku/ParquetViewer .否则, zstd (目前不受 ParquetViewer 支持)解压速度更快,从而提高阅读速度。
    编辑 2:
    我得到了一个对我的机器来说非常大的 csv 文件:20 GB 压缩并扩展到大约 83 GB,而我的家用笔记本电脑只有 16 GB。原来是 read_csv_chunked我之前提到的方法 编辑 无法完成。它总是在一段时间后停止工作并且不会创建所有 parquet大块。使用我以前用 xsv 分割 csv 文件的方法然后循环它们创建 parquet大块工作。公平地说,我必须提到这种方式也进行了多次尝试,并且我编写了一个检查程序以仅创建额外的 parquet连续尝试运行程序时的块。
    编辑 3:
    VROOM 在处理大文件时确实有困难,因为它需要将索引以及从文件中读取的任何数据存储在内存中。见开发线程 https://github.com/r-lib/vroom/issues/203

    关于r - 使用 vroom 在 R 中部分读取非常大的 csv.gz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68628271/

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