我有一个大小为11 GB的SQLite-db和16 GB的RAM(与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
有没有办法以更节省内存的方式进行子集化?我尝试构建矢量扫描矢量,但结果相同。或者有没有办法使用交换空间进行此操作(我真的不关心速度)。
答案 0 :(得分:4)
目前我想到的只有两个:
使用setDT
代替as.data.table
,从db读取时会节省一些内存。
您可以在数据库端计算您的条件,然后在R中使用计算列:
sql = "SELECT *, period >= stableStateStart AS tmpcol FROM inventory"
inventory = setDT(dbGetQuery(conn, sql), key="tmpcol")
inventory[.(TRUE)]
ORDER BY tmpcol
也可能对后续步骤中的setDT(., key="tmpcol")
有帮助。请务必使用data.table 1.9.6 - 最近发布到CRAN。