大 data.table 的内存高效子集

Memory-efficient subsetting of large data.table

我有一个大小为 11 GB 和 16 GB RAM 的 SQLite-db(与 OS 等共享)。我想用 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

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

目前我想到的只有两个:

  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. ORDER BY tmpcol 添加到 sql 查询也可能有助于 setDT(., key="tmpcol") 在后面的步骤中。

一定要使用 data.table 1.9.6 - 最近发布到 CRAN。