2

我正在设计一个 Air 应用程序,它需要在内存中存储数千条记录,并且需要通过各种键有效地对它们进行排序。

我想过使用ByteArray, 因为这样可以避免普通 AS3 对象的所有开销,并且可以让我更有效地使用内存。

但是,挑战在于如何对ByteArray. 我想到了两种可能:

1- 在 AS3 中实现快速排序或堆排序,并以这种方式对数组进行排序。但是,我不确定这是否足够高效。例如,ByteArrays 没有复制内存块的方法;它必须逐字节完成。

2- 创建一个 Air Native Extension (ANE),它使用 C 获取 ByteArray 并对其进行排序。这样做的缺点是,对于它需要运行的所有平台来说,实现起来会更加困难。

你会推荐什么?你以前有做过类似事情的经验吗?

4

2 回答 2

3

我会说使用 Array 或 Vector 对象,有可能对数组进行排序,无论你想要什么键 viasortOn()和 Vectors via sort(),所以你可以实现你需要的任何行为,因为后者接受一个函数作为它的参数,检查这里。而且我相信您不会使用 ByteArrays,因为在对对象进行排序时实际所做的是对其中的链接进行排序,而 ByteArray 将包含实际数据。

于 2013-02-06T10:25:13.553 回答
0

您永远不应该设计任何必须同时在内存中存储数十万个东西的东西。在你不需要的时候卸载东西。你知道100,000是多少吗?取一个字节并乘以 100,000 得到一个 MB。对于记录中的每 1 个字节的数据,您将生成 1MB 的内存。记录 100,000 个整数需要 4MB。

如果您的记录有 2 20 个字符串(名字和姓氏),则字符串字符用 8 个字节表示,因此您刚刚用 640 MB 的内存填充了名字和姓氏。大多数“坏”电脑都有什么…… 2GB 内存?Good Job 占了其中的 1/4。即使您设法通过超人的超级位移将其截断到 ByteArray 级别,您仍然在谈论将数据减少 8 倍。所以现在您只有名字和姓氏的 80MB,而没有其他数据。你可以靠它生存——除了我怀疑你的记录有比 2 个字符串更多的数据。20串?您正在消耗 800MB 的数据。一次卸载除 100 条记录之外的所有内容,这些名称的内存减少到 640KB。是的,您可以在排序时加载和卸载。

内存块的复制速度不会比字节快。全部都是一样。对象向量在切换时表现出色的原因是它们切换引用/指针/单个 32 位/64 位数字,而不是复制内存块。

不清楚你在排序什么。字节最多只能达到 256 的值,因此很明显,您为每条记录使用的字节数多于 1。您想评估每组...比如 2000+ 字节与另一组 2000+ 字节的对比?就像“啊,姓氏是字节 32-83,所以提取这些字节,对于每组 4 个字节,分别将它们位移 0、8、16、32 位,将它们加在一起,将它们的整数值连接成一个字符串,做比较,现在将字节 84-124 与下一个选项中的字节进行比较,现在将字节 0-2000 传输到位置 443530-441530 并且......这些记录中是否有可变长度的字符串或数组?哦,上帝.

Flash 不是在汇编中写入的地方!

Use objects and test the speed & memory consumption. If either makes you cry, use more conventional methods of reducing load; like offloading materials temporarily into text files. The ugliest you should be getting is avoiding objects by storing each individual property in a different Vector. Vector., etc and having the same index refer to one record across the board.

于 2013-09-03T09:47:52.733 回答