ActionScript:数组限制/如何处理大量数据?

时间:2010-10-19 23:39:41

标签: actionscript-3 flash

我遇到了多维数组的问题。

这适用于最多约2000个“集”

var datasets:Array = new Array(
    // one "set"
    new Array( 
        new Array( time:int, x:int, y:int, type:int ), // one "point"
                /* ... */
        /* ~70 more points */
    ),

    /* ... */
    /* ~3500 more sets */
)

有没有更好的方法来处理那么多项?

也许选择XML数据文件是一种更方便的方法吗?

4 个答案:

答案 0 :(得分:0)

首先,一个风格的建议。以下内容:

new Array(x, y, z)

可以用快捷语法表示:

[x, y, z]

这种语法可以更容易地表达嵌套数组,例如:

[x, y, [z1, z2, z3]]

既然我们已经解决了这个问题......对于你的问题确实有一个“正确”的答案,但是我发现的一件事就是你将以这种方式使用大量的嵌套数组。如果每个“set”具有固定数量的项,那么将它们放在一个长数组中然后只进行数学计算以确定如何检索数组中给定x,y位置的值。这就是我的意思,以三个值的三个“集合”为例:

[[a1, a2, a3], [b1, b2, b3], [c1, c2, c3]]

您可以简单地将它们存储为平面方式,而不是嵌套它们:

[a1, a2, a3, b1, b2, b3, c1, c2, c3]

然后,当你想要检索第2组的值(从零开始,它将设置为“1”)和值3(从零开始,它将是值“2”,你只需要访问array[setIndex * 3 + valueIndex]

我要说的另一件事是,结构应该真正由你需要解析和扫描它的方法驱动。如果您提供有关这些要求的更多信息,我们可以为您提供更好的答案。

答案 1 :(得分:0)

您可以使用对象。

多维数组在AS3中并不存在(它们确实存在但您无法访问大多数数组方法)。

你无法真正比​​较数据在数组中并将数据存储在数据文件中。这实际上取决于您需要访问它的频率,处理方式,计算方式等等。

在任何情况下,您始终可以将数据保存为JSON字符串,而不是XML。

var datasets:Array = [
    // one "set"
    // i leave the types as in your example but you 
    // would , of course , put your values instead.
    { 
        { time:int, x:int, y:int, type:int }, // one "point"
                /* ... */
        /* ~70 more points */
    },

    /* ... */
    /* ~3500 more sets */
]

答案 2 :(得分:0)

在Flex 3中创建数组令人惊讶的是性能密集。特别是如果你要像这样嵌套大量的数组,那么使用不同的解决方案会更好。一些建议取决于您对数据的处理方式:

  1. 如果您可以将其中一些存储在文件或数据库中,请执行此操作。毕竟,这就是文件和数据库的用途:存储大量数据。
  2. 如果您确实需要将所有内容保存在内存中,请尝试更高级的集合。看看您是否可以使用ArrayCollection或Dictionary找到更有效的方式来安排数据。
  3. 无论哪种方式,您可能都希望创建一个自定义集合对象,以便与您的file-db或更高级集合解决方案进行交互。我知道自己做那些额外的工作是很蹩脚的,但是有了这么多的数据,你真的会超越Arrays的意图,而定制的解决方案将是你最好的选择。

答案 3 :(得分:0)

如果您针对Flash Player 10+运行,则可以使用Vector.<T>,而不是使用Array进行读取。

除此之外(虽然与FP10无关),我会将你的时间/ x / y /类型移动到CustomPoint类:

var dataSets : Vector.<Vector.<CustomPoint>> = Vector.<Vector.<CustomPoint>>([
    Vector.<CustomPoint>([
        new CustomPoint(time, x, y, type),
        new CustomPoint(time, x, y, type)
    ]),

    // ...
]);