我有一张约 100 万行的表,正尝试通过 TQL 接口由 Java 程序读取(即仅使用普通 Java API,不使用 SQL)。但是当我尝试读取容器时,遇到了内存错误:
Exception in thread "main" com.toshiba.mwcloud.gs.common.GSStatementException: [1043:CM_MEMORY_LIMIT_EXCEEDED] Memory limit exceeded (name=transactionWork.workerStack, requestedSize=67108880, totalSizeLimit=134217728, freeSizeLimit=1048576, totalSize=74448896, freeSize=0) (address=172.18.0.2:10001, partitionId=29)
显而易见的解决方案是增加 storeMemoryLimit,因此我将其从默认的 1024MB 增加到两倍的 2048MB。虽然我增加了内存限制,但我从 Java 程序读取时仍然收到相同的错误,因为 totalSizeLimit 等的值保持不变,这意味着在这种情况下进一步增加 storeMemoryLimit 不会有帮助(尽管我尝试过)。
我还将压缩方法从 NONE 更改为新的 ZSTD,希望它可以将数据集压缩到足够小以便一次读取而不会达到内存限制,但这也失败了。
我唯一的另一个想法是从 TQL 切换到 SQL 并增加 SQL 内存限制,但我不想切换我的整个代码。
有什么办法可以一次性读取整个表格吗?
在这里回答我自己的问题。阅读更多文档后,发现 gs_node.json 配置文件中有一个选项可以设置,但默认情况下不包含该选项。您需要在事务下添加一个名为 workMemoryLimit 的新条目。
您可以在此处看到文档提及的内容:https://docs.griddb.net/architecture/parameter/#node-definition-file-gs-node-json
基本上,此设置设置了使用 TQL 进行的事务的内存上限,这正是我上面所做的。
默认值似乎是 128MB,但我将其增加到 ~2GB,现在将我的 130 万行表直接读入内存没有任何问题。