如何使用 JDBC 将大量数据加载到文件中而不会耗尽内存?

Posted

技术标签:

【中文标题】如何使用 JDBC 将大量数据加载到文件中而不会耗尽内存?【英文标题】:How to load huge Data with JDBC into a file without running out of memory? 【发布时间】:2018-06-27 11:10:34 【问题描述】:

我的问题是我有一个包含大量 GB 记录(双数组)的数据库。所以单条记录最大为 3GB。有没有办法以“片段”的形式加载它并将它们写入文件?

我正在使用 Java、JDBC 驱动程序和 postgresql。

【问题讨论】:

jdbc.postgresql.org/documentation/head/… @a_horse_with_no_name 没有解决单行大小问题 如果单行是多个 GB,您的数据模型可能需要重构 逐列选择它,而不是选择 * 你有没有尝试过?我从来没有使用过数组,但是 JDBC Array api 文档说:“一个数组对象包含一个逻辑指针,指向 SQL ARRAY 值中的数据,而不是包含 ARRAY 值的数据。Array 接口提供了用于引入 SQL ARRAY 值的方法以数组或 ResultSet 对象的形式向客户端发送数据”。所以应该可以在不将所有内容加载到内存的情况下遍历数组元素。 【参考方案1】:

我建议使用复制来加载大量数据。这将需要您做一些工作,但可能非常值得。

【讨论】:

你的意思是用可能的“手”从服务器抓取数据吗?【参考方案2】:

所以单条记录最大为 3GB。有没有办法以“片段”的形式加载它并将它们写入文件?

当前(42.2.3 pgjdbc)中唯一的“流式”数据类型是lobblobclob)。

如果您有 3GB 的 double[],那么您有以下选择:

    分配更多内存(例如-Xmx16G)并逐行处理 通过多个 SQL 执行获取数组内容(例如,前 100 个索引,然后是下 100 个,依此类推) 为 pgjdbc 创建一个 pull request 以支持 copy 数据的流式 API(目前它仅提供 byte[] readFromCopy(),但可以在此处添加流式传输)

【讨论】:

【参考方案3】:

尝试设置FetchSize。同时连接属性AutoCommit 必须为假。和ResultSet.TYPE_FORWARD_ONLY 是必要的

【讨论】:

以上是关于如何使用 JDBC 将大量数据加载到文件中而不会耗尽内存?的主要内容,如果未能解决你的问题,请参考以下文章

如何将大量数据加载到 CoreData

仅将视频加载到 VideoView 中而不立即播放

通过Petnatho通过JDBC进行数据集成到Snowflake的大容量加载速度很慢

将 XmlNodeList 加载到 XmlDocument 中而不循环?

如何将多个 python 文件组织到一个模块中而不像一个包一样?

如何使用实体框架将大量数据延迟加载到 GridView [关闭]