大数据的内存有效子集。表

时间:2015-09-24 12:19:00

标签: r memory data.table subset

我有一个大小为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

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

1 个答案:

答案 0 :(得分:4)

目前我想到的只有两个:

  1. 使用setDT代替as.data.table,从db读取时会节省一些内存。

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

  3. sql = "SELECT *, period >= stableStateStart AS tmpcol FROM inventory"
    inventory = setDT(dbGetQuery(conn, sql), key="tmpcol")
    inventory[.(TRUE)]
    
    1. 在{1}}中添加ORDER BY tmpcol也可能对后续步骤中的setDT(., key="tmpcol")有帮助。
    2. 请务必使用data.table 1.9.6 - 最近发布到CRAN。