分块读取 20GB 文件而不超出我的 RAM - R

Dav*_*vid 4 csv r

我目前正在尝试读取 20GB 的文件。我只需要该文件的 3 列。我的问题是,我的内存限制为 16 GB。我尝试使用该函数和skip参数readr以块的形式使用和处理数据,但这都超出了我的RAM限制。即使是读取一行的调用也会耗尽我所有的 RAM。read_csv_chunkedread_csvread_csv(file, ..., skip = 10000000, nrow = 1)

我现在的问题是,如何读取这个文件?有没有办法在不使用那么多内存的情况下读取文件块?

G. *_*eck 5

LaF包可以以块的形式读取 ASCII 数据。它可以直接使用,或者如果您使用dplyr,则分包使用它提供与 dplyr 一起使用的接口。

readr包具有readr_csv_chunked和相关函数。

网页标题为“循环”的部分以及该页面的后续部分描述了如何使用基本 R 进行分块读取。

如果您删除除前三列之外的所有列,它可能会足够小,只需一次性读入并处理即可。

vroomvroom包中的文件可以非常快速地读入文件,并且还能够仅读入参数中指定的列,select=这可能使其足够小,可以一次性读入。

freaddata.table包中是一个快速读取函数,它还支持select=只能选择指定列的参数。

read.csv.sqlsqldf(另请参阅github 页面)包中,可以将大于 R 可以处理的文件读取到临时外部 SQLite 数据库中,该数据库为您创建并随后删除,并读取给定 R 的 SQL 语句的结果。如果前三列分别命名为 col1、col2 和 col3,然后尝试下面的代码。请参阅 ?read.csv.sql 和 ?sqldf 了解其余参数,这取决于您的文件。

library(sqldf)
DF <- read.csv.sql("myfile", "select col1, col2, col3 from file", 
  dbname = tempfile(), ...)
Run Code Online (Sandbox Code Playgroud)

read.tableread.csvR 的基础中有一个colClasses=参数,它采用列类向量。如果文件有 nc 列,则用于colClasses = rep(c(NA, "NULL"), c(3, nc-3))仅读取前 3 列。

另一种方法是使用 cut、sed 或 awk(在 UNIX 中本地可用,在 Windows 上的 Rtools bin 目录中可用)或任何许多免费命令行实用程序(例如R 外部的csvfix)来预处理文件,以删除除首先三列,然后看看它是否足够小以便可以一次性阅读。

另请查看高性能计算任务视图。