我正在测试一些数据库组件,例如 SDAC
等,我发现了一些有趣的东西:
当我使用 TADOQuery
执行查询并且该查询有很多 blob 字段并且我获取所有行 (fetchall
) 时,我的应用程序的内存接近 1.8 GB 一切正常。
使用其他组件,在同一数据库上执行的同一查询会引发内存不足
异常,因为它超过了 1.8GB 的内存使用量。
我知道我不应该返回所有这些行,我应该使用分页和 blablabla。但我很好奇 ADO 如何设法获取所有行而其他组件却不能。
我认为 ADO 正在压缩内存中的 blob,但这只是一个猜测。
有谁知道为什么 ADO 中的内存使用率这么好?
最佳答案
我不能说关于SDAC,但会说关于AnyDAC TAD查询:
- 如果从 FetchOptions 中排除 fiBlob。 Items ,那么 AnyDAC 将不会立即获取 BLOB 值。但会推迟获取,直到应用程序真正需要 BLOB 值;
- 设置格式选项。 InlineDataSize设置为更小的值,将减少获取具有多个字符字段的大型结果集时的内存使用量;
- 指定格式选项。 MapRules ,应用程序可以选择更紧凑的数据类型表示。
此外,还有一些其他技术可以在获取大型结果集时减少内存使用。为了正确使用它们,开发人员应该知道将返回什么类型的数据。使用某些选项的代价可能是稍微降低获取性能。
关于delphi - AdoQuery 如何处理 blob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8823284/