处理许多 25-80GB CSV 数据集(总计约 10TB)的最有效方法是什么?

问题描述 投票:0回答:1

这个问题是我之前的帖子中更基本的问题。

我想了解如何在以下场景中最有效地处理数据:我有许多具有相同列名的大型(25-80GB).csv 数据集(随着时间的推移跟随一些单位)并且我在 R 中工作。我使用过之前的 {arrow} 和 {duckdb} 的组合(请参阅较早的帖子),但我对其他解决方案持开放态度,例如单独使用 {duckdb} 。也非常欢迎了解更多有关建议方法的资源。

所需的操作将包括根据给定列中某个字符串的出现情况过滤数据(例如,“book_author”列中的字符串“Lewis”)、折叠(例如,个人 X 在 Y 年预订了 3 本书 Lewis 书籍),最后使用 rbind() 处理多个现已清理的数据集。

数据清理结束后,文件应该可以在 data.table 中进行管理。

提前非常感谢。

r bigdata apache-arrow duckdb
1个回答
0
投票
如果您的计算机上安装了

awkgrep,一种可能的选择是在将数据加载到 R 之前过滤“内存不足”的数据。

例如有两个示例 csv 文件(test1.csv 和 test2.csv):

“test1.csv”:

A,B,C,D 1,2,3,4 5,6,7,8
“test2.csv”:

A,B,C,D 11,22,33,44 55,66,77,88
从 R 内部:

library(data.table) dt <- fread(cmd = "awk 'BEGIN{FS=\",\"} $2 ~ \"2\"' ~/Desktop/test*.csv") dt #> V1 V2 V3 V4 #> <int> <int> <int> <int> #> 1: 1 2 3 4 #> 2: 11 22 33 44 dt2 <- fread(cmd = "grep -h \"2\" ~/Desktop/test*.csv") dt2 #> V1 V2 V3 V4 #> <int> <int> <int> <int> #> 1: 1 2 3 4 #> 2: 11 22 33 44

创建于 2024-12-03,使用 reprex v2.1.0

awk

 命令选择第 2 列中包含“2”的行(每个文件中的一个),
grep
 命令选择任何列中包含“2”的行(同样,从每个文件中选择一行)每个文件)。您很可能可以使用 
awk
 处理“个人 X 在 Y 年预订了 3 本书 Lewis 书籍”,但我需要更多详细信息才能在命令中包含此“折叠”(即示例输入和输出)。

注意。此方法假设您的过滤充分减小了结果数据集的大小(即,在选择感兴趣的行后,它适合 RAM),并且您已安装

awk

grep

© www.soinside.com 2019 - 2024. All rights reserved.