根据标准从大型数据集中读取特定数据,以避免将整个文件读入内存

Posted

技术标签:

【中文标题】根据标准从大型数据集中读取特定数据,以避免将整个文件读入内存【英文标题】:Reading specific data from large dataset based on criteria to avoid reading entire file into memory 【发布时间】:2015-08-18 12:16:24 【问题描述】:

软件:R Studio 版本:0.98.1102 操作系统:Windows 7 专业版

问题 #1:我有一个 100MB 以上的 .txt 文件。它有 4 个变量,每个变量有超过 500,000 个观察值。 问题 #2:假设 column1 是一个包含日期因素的列。是否可以使用 read.csv() 的 colClasses 参数将仅 column1 的类更改为日期类?如果我通过以下方式读取文件:

mydata <- read.csv("myfile", sep = ";", na.strings = "?", stringsAsFactors = FALSE)

问题 #1 由于文件的大小,该文件会无限期地加载到我的计算机上。

文件格式

column1                                                                                                                                                                                                                                                                                               狗                鸟            苹果 猫               鸽子           橙色 大鼠              麻雀         猕猴桃 可能                鸟            苹果 猫               鸽子           橙色 老鼠              麻雀          猕猴桃

我正在尝试弄清楚如何执行以下操作: 1. 只读取数据集中第 1 列有“dog”的行 2. 只读数据集中第1列有狗,第2列有鸟的行

到目前为止我一直在尝试的事情 1. 我读到我可以加载整个数据然后对其进行子集化,但我真的想避免这种情况。原因是文件太大而最初无法加载。相反,我想只加载基于标准的特定数据

问题 #2 假设 column1 的形式为 05/01/2015,但具有“因子”类。是否可以使用 read.csv 的 colClasses 参数将仅列 1 的类更改为类“日期”?也许是这样的?

mydata <- read.csv("myfile", sep = ";", na.strings = "?",   
stringsAsFactors = FALSE, colClasses = c(column1 =as.date(column1))

或者可能是这样的

mydata <- read.csv("myfile", sep = ";", na.strings = "?",   
stringsAsFactors = FALSE, colClasses = c(column1 =strptime(column1 %MM%DD%YY))

【问题讨论】:

您应该提供 R 的版本,而不是 RStudio 的版本。 不完全是您想要的,但来自readr 包的read_csvread.csv 快很多(~10 倍),当然来自data.tablefread 甚至更快(~2x)。 【参考方案1】:

您可以将数据读取成块,例如一次读取 1000 行并将它们子集化。

temp <- read.csv('file.csv', nrows=1000, stringsAsFactors=FALSE)

但在 R 中使用 for 循环并不总是一个好主意。所以,我更喜欢使用 sqldf

library(sqldf)
power <- read.csv.sql("file.csv", sql = "select * from file where codition ", 
                      header = TRUE)

在此问题中查看有关如何执行此操作的更多选项 How do i read only lines that fulfil a condition from a csv into R

【讨论】:

【参考方案2】:
    仅读取数据集中第 1 列具有“dog”的行 Ans: 我以“data”的名义保存了你的数据并应用了这个选项“data[grep("dog",data$column1),]"

希望对您有所帮助。

【讨论】:

据我所知,max.print 不会增加内存容量/使用率,它会设置打印到终端的最大行数。 ***.com/questions/6758727/…。您应该修改或删除。 这个想法不是需要将整个数据保存到内存中吗?这首先是问题所在。

以上是关于根据标准从大型数据集中读取特定数据,以避免将整个文件读入内存的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyarrow 从分区拼花数据集中读取特定分区

R:从R中的大型数据集中根据列中的值删除行[重复]

将大型数据集分组为特定标准

从大型 JSON 中读取特定字段并导入 Pandas 数据框

从大型数据集中采样

使用 python 在大型数据集中快速查找