2010-10-19 58 views
0

我遇到了多維數組的麻煩。ActionScript:數組限制/如何處理大量數據?

這與行之有效高達約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數據文件是一種更方便的方法?

+1

什麼是你正在運行到麻煩?處理過於緩慢,還是您在談論實際輸入或初始化數據的麻煩? (如果後面的數據是以什麼格式開始的?) – fenomas 2010-10-20 00:39:10

+0

初始化數組可能確實是一個問題。然而,使用簡化數組符號和簡化結構,該大小的數組可以正常工作。 雖然問題可能已經具有在單行數組定義。 – user479786 2010-10-20 12:21:16

回答

0

首先,一個文體建議。以下:

new Array(x, y, z) 

可以通過快捷鍵語法來表達:

[x, y, z] 

這句法使得它更容易表達嵌套的數組,例如:

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

現在,我們已經有了那就是......你的問題確實有一個「正確的」答案,但是對我而言,一件事情就是你將以這種方式使用很多嵌套數組。如果每個「集合」都有固定數量的項目,那麼將它們放入一個長陣列,然後只是進行數學運算以確定如何檢索陣列中給定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]

另一件事我會說的是,結構應該真正由你所需要的手段來驅動解析並掃描它。如果您提供有關這些要求的更多信息,我們可以爲您提供更好的答案。

+0

好的展平似乎真的有幫助。不過,在單行中定義數組可能是一個壞習慣。 現在這與工作過的那些「套」 4300。 (足以容納所有東西:) – user479786 2010-10-20 12:13:20

+0

你是否將代碼中的數據定義爲文字?如果是這樣,那絕對不是可維護的。你可以很容易地從文件中讀取(也許CSV或其他?)。 – Marplesoft 2010-10-20 16:43:18

0

您可以使用Objects來代替。

多維數組在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 */ 
] 
+0

使用數據文件更像是將問題處理數據推送到一些經過驗證的類。我猜XML類對於大量的數據是非常優化的。 但是JSON可能確實是更好的選擇,考慮文件大小和其導入帳戶的方式。 – user479786 2010-10-20 12:43:45

0

創建數組是令人驚訝的性能密集型的Flex 3中特別是如果你要嵌套它們像一個巨大的一堆,你要和不同的解決方案的方式更好。一些建議取決於你對數據做什麼:

  1. 如果你可以通過在文件或數據庫中存儲它的一部分,那麼做到這一點。畢竟這就是文件和數據庫的用途:存儲大量數據。
  2. 如果你真的需要保留在內存中的一切,嘗試一些更高級的集合。查看您是否可以使用ArrayCollection或Dictionary查找更有效的數據排列方式。

無論採用哪種方式,您都可能想要創建一個自定義collectionish對象來與文件db或更高級的集合解決方案進行交互。我知道自己做這些額外的工作是跛腳的,但有了這麼多的數據,你真的會推動陣列的發展,而定製的解決方案將會是你最好的選擇。

0

如果要針對Flash Player中運行10+就可以使用Vector.<T>取而代之的,是顯著快於陣中讀取。

最重要的是(雖然無關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) 
    ]), 

    // ... 
]); 
+0

我認爲你提到的Point類是一個自定義類,不要與flash.geom.Point類混淆?另外,你從哪裏得到FP10「將其參考存儲在連續的內存中」? – Joony 2010-10-20 08:18:41

+0

@Joony - 我確實是指一個自定義點,我在我的示例中更改了類的名稱。 Vector之一。 '的優勢,比不需要類型強制其他,在於它是不可變的,並代表一個連續存儲器塊。雖然我找不到連續內存的參考,但文檔提到它比Array更高效:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Vector.html - I將從我的帖子中更改連續的內存引用,直到找到引用。 – 2010-10-20 09:42:42

+0

我沒有真正寫數據,在初始化過程中使用過一次。生成許多​​補間,之後再也不會再碰。 然而,Greensock的TweenLite引擎正在處理所有這些魅力。 那麼仍然去向量? (使用數組的解決方案現在可以工作。) – user479786 2010-10-20 12:27:14