我有几个很大的R data.frames,我想把它们放到本地的duckdb数据库中。我遇到的问题是duckdb似乎将所有内容加载到内存中,即使我指定了一个文件作为位置。
另外,我还不清楚建立连接的正确方式(所以我不确定这是否与此有关)。我试过:
duckdrv <- duckdb(dbdir="dt.db", read_only=FALSE)
dkCon <- dbConnect(drv=duckdrv)还包括:
duckdrv <- duckdb()
dkCon <- dbConnect(drv=duckdrv, dbdir="dt.db", read_only=FALSE)两者都工作得很好,这意味着我可以创建表、使用dbWriteTable、运行查询等等。然而,内存使用量非常高(大约与data.frames大小相同)。我想我在某个地方读到了duckdb默认使用一定%的可用内存,这对我来说是行不通的,因为我使用的系统是一个共享资源。我还想并行运行一些查询,这将提高内存的使用率。
我试过这样做:
dbExecute(dkCon, "PRAGMA memory_limit='1GB';")但这似乎没有什么区别,即使我关闭了连接,关闭了实例并重新连接。
有人知道我怎样才能解决这个问题吗?当我将数据写入表时,RSQLite也有很高的内存使用率,但是它会恢复正常,如果我打开只读连接,这根本不是一个问题。我想让duckdb工作,因为我认为查询应该更快。任何帮助都将不胜感激!
发布于 2022-11-13 14:27:34
您的方法是正确的--使用memory_limit实用化,但是您使用了过时的版本。
例如,使用DuckDb版本0.5.1:
library("DBI")
con = dbConnect(duckdb::duckdb(), dbdir="my-db.duckdb")
dbExecute(conn = con, paste0("PRAGMA memory_limit='500MB'"))
dbGetQuery(conn = con, "PRAGMA version")
dbExecute(con, "CREATE TABLE gen AS SELECT * FROM 'gen1GB.csv'")
dbGetQuery(conn = con, "select count(*) from gen")这为我提供了以下产出:
library_version source_id
1 0.5.1 7c111322d
count_star()
1 1e+08内存使用量小于500 is。在MacOs上,可以使用以下方法检查:
ps axu | grep 'lib\/R' | awk '{print $6 " " $11}'
464768 /usr/local/Cellar/r/4.2.1_4/lib/R/bin/exec/R您可以使用以下方法生成测试csv文件:
import numpy as np
import pandas as pd
rng = np.random.default_rng()
df = pd.DataFrame(rng.integers(0, 100, size=(100000000, 4)), columns=list('ABCD'))
df.to_csv('gen1GB.csv', index=False)发布于 2022-11-20 17:13:16
可以使用普拉格玛或设置语句在DuckDB中设置内存限制。默认情况下,75%的RAM是限制。
con.execute("PRAGMA memory_limit='200MB'")或
con.execute("SET memory_limit='200MB'")我可以确认这个限制有效。然而,这并不是一个很难的限制,有时可能会因为数据量、您正在查询的数据的格式(例如:来自s3的拼花)、查询类型--特定的局限性或围绕着它的某些约束而被超过。
下面是一个示例,其中纯文本(Csv)的数据量大约为4.23GB。这些数据首先加载到DuckDB中,然后通过设置memory_limit='200MB'来运行一些SQL查询。下面的屏幕截图显示py脚本使用的最大记录内存。

https://stackoverflow.com/questions/68656092
复制相似问题