大 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 进行此操作(我不太关心速度)。
目前我想到的只有两个:
使用setDT
而不是as.data.table
,从数据库读取时会节省一些内存。
您可以在数据库端计算条件,然后在 R 中使用计算列:
sql = "SELECT *, period >= stableStateStart AS tmpcol FROM inventory"
inventory = setDT(dbGetQuery(conn, sql), key="tmpcol")
inventory[.(TRUE)]
- 将
ORDER BY tmpcol
添加到 sql 查询也可能有助于 setDT(., key="tmpcol")
在后面的步骤中。
一定要使用 data.table 1.9.6 - 最近发布到 CRAN。
我有一个大小为 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 进行此操作(我不太关心速度)。
目前我想到的只有两个:
使用
setDT
而不是as.data.table
,从数据库读取时会节省一些内存。您可以在数据库端计算条件,然后在 R 中使用计算列:
sql = "SELECT *, period >= stableStateStart AS tmpcol FROM inventory"
inventory = setDT(dbGetQuery(conn, sql), key="tmpcol")
inventory[.(TRUE)]
- 将
ORDER BY tmpcol
添加到 sql 查询也可能有助于setDT(., key="tmpcol")
在后面的步骤中。
一定要使用 data.table 1.9.6 - 最近发布到 CRAN。