【发布时间】:2011-11-03 20:21:57
【问题描述】:
我正在开发一个模拟程序。
程序做的第一件事就是读入一个巨大的文件(28 mb,大约 79000 行),解析每一行(大约 150 个字段),为对象创建一个类,并将其添加到字符串列表。
它还读取另一个文件,该文件在运行期间添加了更多对象。最后,它最终变成了大约 85,000 个对象。
我使用的是 Delphi 2007,该程序使用了大量内存,但运行正常。我升级到 Delphi XE,并将程序迁移过来,现在它使用了更多的内存,最终在运行中途内存不足。
所以在 Delphi 2007 中,读取初始文件后最终会使用 1.4 gigs,这显然是一个巨大的数量,但在 XE 中,它最终会使用几乎 1.8 gigs,这确实是巨大的并导致用完并得到错误
所以我的问题是
- 为什么要使用这么多内存?
- 为什么它在 XE 中使用的内存比 2007 多得多?
- 对此我能做些什么?我无法更改文件的大小或长度,我确实需要为每一行创建一个对象并将其存储在某处
谢谢
【问题讨论】:
-
你确定数字不是 1.4 和 2.8?
-
Unicode 比 AnsiString 大。这是基于 TStringList 类的。
-
在您可以完全依赖 64 位进程之前,您应该重新设计您的应用程序以更节俭地使用内存。即使是 1.4gb,您也会在 32 位系统上突破地址空间的限制。
-
@Andreas:如果他所有的数据都是字符串,是的,大约是 2.8GB,但我假设字符串数据是 800MB(与 Ansi 中的 400MB 相比),其余的(1GB)被他的物品占据。正如 David Heffernan 所说,在其中一个 cmets 中,1.4GB 和 1.8GB 都在突破极限。
-
@David:好吧,那么我想我们真的在推动应用程序加载后内存中可用的 90+ GB 模型(200+ 百万个实例)的极限。 6 小时...(并且仍然为 100 名用户提供服务)您算算,这是不可能的,但我们做到了。不要问我怎么做,因为...我只知道广义上的。有几个 wiz 同事了解详细信息 :-)) 但我们肯定没有使用 TStringLists 或 TObjectLists 作为容器......哎呀,我们的对象中甚至没有数据,我们忽略/覆盖了监视器字段在 D2009 中偷偷引入。 64位转换会很有趣:-))
标签: delphi memory-management tstringlist