delphi – 大型动态数组 – 慢速写入

delphi – 大型动态数组 – 慢速写入,第1张

概述我有一个例程,它将序数元素(“Day”或“Night”枚举类型)添加到多维动态数组中,该数组声明为: TShiftType = (stDay, stNight);TScheduleArray = array of array of array [1..DaysPerWeek] of TShiftType; 该数组可以包含1个元素(例如(日,日,日,日,白,夜,夜))和超过20,000个元素之间 我有一个例程,它将序数元素(“Day”或“Night”枚举类型)添加到多维动态数组中,该数组声明为:

TShiftType = (stDay,stNight);TScheduleArray =  array of array of array [1..DaysPerWeek] of TShiftType;

该数组可以包含1个元素(例如(日,日,白,夜,夜))和超过20,000个元素之间的任何内容.每个元素本身可以具有子元素,这取决于正在处理的周数.

因此,两周数组中的一个元素可能如下所示:

((stDay,stDay,stNight,stNight),(stDay,stNight))

当元素数量相对较低(大约低于1000)时,这种方法运行得非常快并且效果很好.一旦周数和元素增加,只需向数组添加一个新元素(在调用SetLength以将数组长度增加一个之后)开始以指数方式减慢.

有时我也会收到访问冲突.当我在Delphi中使用“Find Error”工具时,它会转到cpu窗口中的@DynArrayAsg方法.但是我从来没有得到过Delphi帮助说如果没有足够的内存可用于重新分配变量的EOutOfMemory异常.

这是否会降低对内存预期行为的访问速度?我正在使用Delphi 6.

解决方法 是的,因为当你重新分配它时,如果没有足够的连续空间只在现有数组的末尾添加一个元素,它必须找到另一个足够大的块,分配它,复制整个现有数组,然后取消分配原版的.数组越大,副本就越长.

TList通过以两种大小的大小分配其内部数组来帮助缓解这个问题,而不是“完全和我需要的一样大”,然后使用Count变量来标记实际使用的内部的上限.也许你可以做类似的事情?

此外,如果您还没有它,请获取FastMM.与Delphi 6的内置内存管理器相比,分配和重新分配内存要好得多.

总结

以上是内存溢出为你收集整理的delphi – 大型动态数组 – 慢速写入全部内容,希望文章能够帮你解决delphi – 大型动态数组 – 慢速写入所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1258614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存