【问题标题】:Memory-efficient subsetting of large data.table大数据表的内存高效子集
【发布时间】:2015-09-24 12:18:59
【问题描述】:

我有一个大小为 11 GB 和 16 GB RAM(与操作系统等共享)的 SQLite-db。我想用 data.table 执行子集方法:

# database connection
con = dbConnect(dbDriver("SQLite"), dbname=sqlite_database)

# read table from database
inventory <- as.data.table(dbGetQuery( con,'select * from inventory'))

# subset table
unfulfilled_inventory <- inventory[period >= stableStateStart, .(period, articleID, unfulfilledQuantities, backlog, stock)]

获得更多 RAM 将是解决此问题的最便宜的方法,但不幸的是,这不是一种选择。

库存对象有 127,500,000 行,包含 6 个变量。清单对象在内存中分配的大小为 5.2 GB。

dim(unfulfilled_inventory)
[1] 127500000         6

有没有办法以更节省内存的方式进行此子集化?我尝试为矢量扫描构建一个矢量,但结果相同。或者有没有办法为此操作使用交换空间(我并不关心速度)。

【问题讨论】:

  • 确认一下,5.2GB 是哪个对象?还有dim(inventory) 的结果是什么?
  • 更新了问题

标签: r memory data.table subset


【解决方案1】:

目前我想到的只有两个:

  1. 使用setDT 而不是as.data.table,从数据库读取时会节省一些内存。

  2. 您可以在数据库端计算您的条件,然后使用 R 中的计算列:

sql = "SELECT *, period >= stableStateStart AS tmpcol FROM inventory"
inventory = setDT(dbGetQuery(conn, sql), key="tmpcol")
inventory[.(TRUE)]
  1. 在 sql 查询中添加 ORDER BY tmpcol 也可能有助于后续步骤中的 setDT(., key="tmpcol")

请务必使用 data.table 1.9.6 - 最近发布到 CRAN。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多