Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:导入数百万个小型字母数字csv文件_R - Fatal编程技术网

R:导入数百万个小型字母数字csv文件

R:导入数百万个小型字母数字csv文件,r,R,我有大约300GB的15KB csv文件(每个文件正好有100行),需要导入、连接、操作并作为单个rds重新保存 我已经通过只导入我需要的列来减少所需的RAM量,但是一旦我需要对列执行任何操作,我就会将其最大化 对于这类问题,您的策略是什么?这是回答您问题的一次尝试。 虽然这可能不是最有效的解决方案,但它是有效的。最大的好处是不需要一次存储所有信息,只需将结果附加到文件中即可 如果速度不够快,可以使用parallel来加速 library(tidyverse) library(data.tabl

我有大约300GB的15KB csv文件(每个文件正好有100行),需要导入、连接、操作并作为单个rds重新保存

我已经通过只导入我需要的列来减少所需的RAM量,但是一旦我需要对列执行任何操作,我就会将其最大化


对于这类问题,您的策略是什么?

这是回答您问题的一次尝试。 虽然这可能不是最有效的解决方案,但它是有效的。最大的好处是不需要一次存储所有信息,只需将结果附加到文件中即可

如果速度不够快,可以使用
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%同意,我不需要所有这些数据。我希望我可以大幅降低样品,但我需要先“看看”它看起来像什么。也就是说,至少可以得到一些汇总统计数据,但我还没有完全弄清楚,如果你知道我的意思,我怎么知道我可以扔掉多少呢?真的非常感谢你。我要走了