【问题标题】:Choosing the right approach for a 50GB file [closed]为 50GB 文件选择正确的方法 [关闭]
【发布时间】:2020-09-08 19:49:35
【问题描述】:

我正在提取的数据将生成一个大约有 1.5B 行的文件。

我正在考虑应该使用什么系统来分析数据。数据结构非常简单。

我正在考虑使用像 Spark 这样的分布式系统或像 DataTables 这样的 R 系统来处理数据。

假设我在一台有大量内存的机器上,我可以在 R 中使用带有 DataTables 的 50GB / 1.5B 行数据集吗?

【问题讨论】:

  • 也许我可以通过减少编号来减小文件大小。我在任何时候都在使用的列数

标签: r datatable


【解决方案1】:

我建议您使用 data.table 包中的fread()。您可以按照以下方式进行操作:

  1. 加载几行数据进行分析。如果您想将其加载为 dataframe 类对象,而不是 数据表,您可以设置参数 data.table = FALSE
df = fread(file = , nrows = 10, stringsAsFactors = FALSE)
  1. 快速查看数据表并为向量中的每一列定义类。您还应该检查是否可以跳过某些行或列。
classes = c('numeric', 'character', ...)
rows = c(1:1000, 20000:50000, ...)
cols = c(1, 6, 8, ...)
  1. 加载整个数据,如果可能,跳过行和列,并定义每列感兴趣的类。
df = fread(file = , drop = -cols, colClasses = classes, nrows = rows)

Ps.:如果您的内存仍然无法存储全部数据,请构建一个函数来读取、处理和写入数据,并使用 nrows 参数多次调用它将数据拆分为片段。

【讨论】:

    【解决方案2】:

    你可以使用{disk.frame},见https://diskframe.com

    它是为此类问题而设计的。

    【讨论】:

    • 我知道数据表与引用一起使用。当我在磁盘框架中操作一个对象时,我是在创建它的副本还是更改它的引用?例如,如果我使用hard_arrange,我是否会创建对象的副本然后丢弃旧对象?
    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多