根据标准从大型数据集中读取特定数据,以避免将整个文件读入内存
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_csv
比read.csv
快很多(~10 倍),当然来自data.table
的fread
甚至更快(~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/…。您应该修改或删除。 这个想法不是需要将整个数据保存到内存中吗?这首先是问题所在。以上是关于根据标准从大型数据集中读取特定数据,以避免将整个文件读入内存的主要内容,如果未能解决你的问题,请参考以下文章