R:导入数百万个小型字母数字csv文件
我有大约300GB的15KB csv文件(每个文件正好有100行),需要导入、连接、操作并作为单个rds重新保存 我已经通过只导入我需要的列来减少所需的RAM量,但是一旦我需要对列执行任何操作,我就会将其最大化R:导入数百万个小型字母数字csv文件,r,R,我有大约300GB的15KB csv文件(每个文件正好有100行),需要导入、连接、操作并作为单个rds重新保存 我已经通过只导入我需要的列来减少所需的RAM量,但是一旦我需要对列执行任何操作,我就会将其最大化 对于这类问题,您的策略是什么?这是回答您问题的一次尝试。 虽然这可能不是最有效的解决方案,但它是有效的。最大的好处是不需要一次存储所有信息,只需将结果附加到文件中即可 如果速度不够快,可以使用parallel来加速 library(tidyverse) library(data.tabl
对于这类问题,您的策略是什么?这是回答您问题的一次尝试。 虽然这可能不是最有效的解决方案,但它是有效的。最大的好处是不需要一次存储所有信息,只需将结果附加到文件中即可 如果速度不够快,可以使用
parallel
来加速
library(tidyverse)
library(data.table)
# Make some example files
for (file_number in 1:1000) {
df = data.frame(a = runif(10), b = runif(10))
write_csv(x = df, path = paste0("example_",file_number,".csv"))
}
# Get the list of files, change getwd() to your directory,
list_of_files <- list.files(path = getwd(), full.names = TRUE)
# Define function to read, manipulate, and save result
read_man_save <- function(filename) {
# Read file using data.table fread, which is faster than read_csv
df = fread(file = filename)
# Do the manipulation here, for example getting only the mean of A
result = mean(df$a)
# Append to a file
write(result, file = "out.csv", append = TRUE)
}
# Use lapply to perform the function over the list of filenames
# The output (which is null) is stored in a junk object
junk <- lapply(list_of_files, read_man_save)
# The resulting "out.csv" now contains 1000 lines of the mean
库(tidyverse)
库(数据表)
#制作一些示例文件
用于(文件编号为1:1000){
df=data.frame(a=runif(10),b=runif(10))
写入\u csv(x=df,path=paste0(“示例”,文件号,.csv”))
}
#获取文件列表,将getwd()更改为您的目录,
列出所有文件这是回答你问题的一次尝试。
虽然这可能不是最有效的解决方案,但它是有效的。最大的好处是不需要一次存储所有信息,只需将结果附加到文件中即可
如果速度不够快,可以使用parallel
来加速
library(tidyverse)
library(data.table)
# Make some example files
for (file_number in 1:1000) {
df = data.frame(a = runif(10), b = runif(10))
write_csv(x = df, path = paste0("example_",file_number,".csv"))
}
# Get the list of files, change getwd() to your directory,
list_of_files <- list.files(path = getwd(), full.names = TRUE)
# Define function to read, manipulate, and save result
read_man_save <- function(filename) {
# Read file using data.table fread, which is faster than read_csv
df = fread(file = filename)
# Do the manipulation here, for example getting only the mean of A
result = mean(df$a)
# Append to a file
write(result, file = "out.csv", append = TRUE)
}
# Use lapply to perform the function over the list of filenames
# The output (which is null) is stored in a junk object
junk <- lapply(list_of_files, read_man_save)
# The resulting "out.csv" now contains 1000 lines of the mean
库(tidyverse)
库(数据表)
#制作一些示例文件
用于(文件编号为1:1000){
df=data.frame(a=runif(10),b=runif(10))
写入\u csv(x=df,path=paste0(“示例”,文件号,.csv”))
}
#获取文件列表,将getwd()更改为您的目录,
列出_文件的_您也可以使用该库,它旨在允许对大于RAM的数据进行操作。
然后,您可以像在data.table中一样操作数据,或者使用dplyr谓词操作数据。您也可以使用库,它的设计允许操作大于RAM的数据。
然后,您可以像在data.table中一样或使用dplyr谓词来操作数据。您真的需要一次操作所有数据吗?如果是这样的话,一个选择是将所有数据都泵入数据库,并在将其存储到数据库中时尽可能多地进行预处理,然后在那里执行最终计算。如果拆分流程不是一种选择,那么云服务(amazon等)或您自己的集群(spark/h2o)可能是一种方式,您希望执行哪种操作?确实有必要一次读取所有行吗?那么这是一种更好的方法——列出所有文件,并使用lappy
将函数应用于每个文件。使用命令行工具,如sed
或awk
,可能值得这样做?不确定速度差?我认为没有必要。另一种可行的方法是根本不将其存储在R中,而是在每次读取时在一个新的.CSV文件中写入一行以存储结果。我可以在一小时内输入一个示例答案。您真的需要一次输入所有数据才能执行此操作吗?如果是这样的话,一个选择是将所有数据都泵入数据库,并在将其存储到数据库中时尽可能多地进行预处理,然后在那里执行最终计算。如果拆分流程不是一种选择,那么云服务(amazon等)或您自己的集群(spark/h2o)可能是一种方式,您希望执行哪种操作?确实有必要一次读取所有行吗?那么这是一种更好的方法——列出所有文件,并使用lappy
将函数应用于每个文件。使用命令行工具,如sed
或awk
,可能值得这样做?不确定速度差?我认为没有必要。另一种可行的方法是根本不将其存储在R中,而是在每次读取时在一个新的.CSV文件中写入一行以存储结果。我可以在一个小时内输入一个示例答案。谢谢您分享这个软件包。我认为这可能很好地解决了一个我将直面的问题,目前我还处于无法导入所有文件以使其成为一个大的300GB data.table的阶段。您可以查看“摄取数据”文章:。这里有一个关于加载多个csv文件的示例。感谢您提供的链接和软件包。在以可管理的形式获取这些数据后,我也会使用它。我刚刚更仔细地阅读了那篇文章,似乎disk.frame确实可以一次接收多个csv文件。我会深入研究这个问题,谢谢你分享这个包裹。我认为这可能很好地解决了一个我将直面的问题,目前我还处于无法导入所有文件以使其成为一个大的300GB data.table的阶段。您可以查看“摄取数据”文章:。这里有一个关于加载多个csv文件的示例。感谢您提供的链接和软件包。在以可管理的形式获取这些数据后,我也会使用它。我刚刚更仔细地阅读了那篇文章,似乎disk.frame确实可以一次接收多个csv文件。我会深入研究的,非常感谢。我将不得不修改我的工作流下游,我想这是因为我一直在玩一个小的测试数据集,我正在使用shiny以交互和动态方式绘制它。我想如果我现在得到所有的方法,那可能是一种下采样的方法。如果你改变了文件列表,你可以在更小的数据集上测试,也可以对不同的方法进行基准测试。当涉及到绘制所有内容时,您应该问问自己是否需要绘制300GB的数据disk.frame
(正如Wawv所建议的)或其他用于容纳大型文件的实用程序是一个选项。谢谢。是的,我100%同意,我不需要所有这些数据。我希望我可以大幅降低样品,但我需要先“看看”它看起来像什么。也就是说,至少可以得到一些汇总统计数据,但我还没有完全弄清楚,如果你知道我的意思,我怎么知道我可以扔掉多少呢?真的非常感谢你。我要走了