3

我正在尝试测试一种在 .NET 和 R 之间共享大型数据集的方法。我目前的想法是

  1. 从 .NET 打开 SQLite 数据库连接;
  2. 将我在.NET中生成的所有数据写入这个数据库;
  3. 使用 R.NET 中的 REngine在同一进程中运行 R,并使用 RSQLite连接到打开的 SQLite 连接。

我已经有了一个原型,它通过写入位于硬盘上的临时文件中的 SQLite 数据库来工作。将 5000 万行每行有 6 列从 .NET 传输到 R 大约需要 15 分钟。但是,我想通过使用内存或临时 SQLite 数据库来提高性能。我尝试使用以下连接字符串在 .NET 中启动 SQLite 内存数据库 FullUri=file::memory:?cache=shared:然后在同一进程中启动 R。以下代码在 R.NET 的 REngine 中执行,以尝试连接到相同的内存数据库。但是,我随后意识到它是一个新的内存数据库,而我最初使用 .NET 保存的表在这个新连接中不可用。所以我要问的问题是我是否可以使用“cache=shared”连接到共享的内存 SQLite 数据库SQLite 的文档

library(RSQLite)
sqlite = SQLite(shared.cache=TRUE)
conn = dbConnect(sqlite, dbname = ':memory:')
dbListTables(conn)

补充一点:我在一个独立的 R 实例中使用了以下代码,我发现即使使用桌面 R,我也无法启动两个共享同一个内存数据库的连接。例如,下面的 conn2 中没有任何表。

library(RSQLite)
sqlite = SQLite(shared.cache=TRUE)
conn = dbConnect(sqlite, dbname = ':memory:')
dbWriteTable(conn, name="Test", test)
dbListTables(conn)
conn2 = dbConnect(sqlite, ':memory:')
dbListTables(conn2)
4

1 回答 1

3

我不完全了解 R.net 或 RSQLite。无论如何,您使用的方法不能确保与同一个内存数据库的多个连接,因为内存数据库的范围仍然限于关闭最后一个连接对象。

根据SQLite 文档

当与数据库的最后一个连接关闭时,数据库会自动删除并回收内存。

我今天遇到了同样的情况,我正在考虑打开一个与以下连接字符串无关的连接

"FullUri=file::memory:?cache=shared" 

然后运行函数(需要共享内存数据库),然后关闭上面的连接。通过这样做,您甚至不必修改数据访问层,这将确保至少有一个与内存数据库的连接仍然打开。

于 2013-10-30T03:50:05.783 回答