2011-09-19 56 views
1

我有以下情況:有一個包含4個圖表的屏幕,每個圖表都填充59個數組集合。每個數組集合都有2000多個數據點。ArrayCollection快速過濾

這個構造需要被過濾(按時間),但是我遇到的問題是過濾需要很長時間才能完成(這是預期給定的數據點數量需要過濾)。

一次篩選一張圖表不是選項,所以我想問你,你認爲最好的方法是什麼? (我應該使用矢量嗎?)。爲了概括這個問題,在flex/as3中過濾大型集合的最佳方法是什麼?

謝謝。

+1

據我所知'矢量'是最好的選擇 – www0z0k

+0

矢量沒有內置過濾。沒有「VectorCollection」。但是,您可能可以編寫自己的Vector濾鏡。據推測,矢量比數組快得多。你可能想重新考慮你的架構;因爲這是很多的收集和大量的數據點。 – JeffryHouser

+0

更改架構實在不是一個選項... – Radu

回答

0

我建議過濾服務器上的大集合。這樣做有幾個好處:

  • 你可以因爲只有過濾的數據必須傳送
  • 服務器端計算可以並行,是因爲更高性能的硬件和服務器通常更快,最大限度地減少網絡流量運行時語言(例如Java)。
  • 服務請求是異步進行的,所以您的客戶端應用程序不會被阻止
+0

此方法可以使服務器停止所有數據處理。 –

+0

@The_asMan:處理118000+個數據點對於Java來說並不算什麼,它比ActionScript快得多。我想這個迴應應該在一秒鐘內發出。你是對的,如果有很多客戶端可能會使服務器超載,但這是特定於應用程序的,必須進行評估。 – splash

1

你必須擠壓出的性能改進可能的話每一個位而這適合:

  • 使用矢量如果可能的,儘可能多的。它具有(與www.flextras.com假定的相反)接受過濾功能的過濾器屬性。 ArrayCollections速度很慢。 (一般來說,所有的Flex本地類都不必要地慢)所以如果你真的要使用ArrayCollections,只能用它們來呈現結果向量。

  • 如果問題是應用程序「凍結」,您可以查看綠色線程,以便您可以向用戶顯示進度欄,這樣他們至少會有進步感。 http://blog.generalrelativity.org/actionscript-30/green-threads/

+0

+1用於在矢量濾鏡上糾正我。不過,它看起來像它們的操作方式與集合類中的filterFunction非常不同。 – JeffryHouser

+0

昨天我開始研究綠色線程和使用向量的可能性。我會更新代碼,做一些測試並寫出結果的評論。 – Radu

0

使用矢量的儘可能使用綠色線程,如果你仍然無法管理。在內部,我們使用大量字典來緩存計算查詢以供以後查找。 as3中的字典是最快的對象之一。所以我們在背景中進行預過濾,並在字典中講述各種過濾集合。不知道它是否適合你的情況。

0

好吧,所以我搜索了更多的綠色線程,並偶然發現了一個gskinner項目(PerformanceTestv2)。測試數據生成與渲染時間得到了以下結果:

[MethodTest name ='設置增益系列測試:'time = 1056.0 min = 1056 max = 1056 deviation = 0.000 memory = 688] //過濾數據源[MethodTest name ='設置增益系列測試:'time = 24810.0 min = 24810 max = 24810 deviation = 0.000 memory = 16488] //過濾+渲染。

接下來我介紹瞭如何提高圖表的渲染時間,但沒有太大的改進。但是我找到了一個基於Degrafa的項目:Axis。這已被移植到flex 4,事件4.5([Axiss 4.5])3。我已經基於這個框架整合了圖表,到目前爲止結果非常好。