2013-02-06 20 views
2

我設計需要存儲大量的記錄在內存中,並且需要他們通過各種按鍵有效進行排序,AIR應用程序。排序一個字節組AS3

我想用一個ByteArray的,因爲這將避免在正常AS3對象的所有開銷,並且可以讓我更有效地利用內存。

但是,面臨的挑戰是如何將ByteArray裏面的記錄進行排序。我想到了兩種可能性:

1-實現快速排序或堆排序在AS3和排序數組這種方式。但是,我不確定這會足夠高性能。例如,ByteArrays沒有方法來複制周圍的內存塊;它必須逐字節地完成。

2-創建一個採用ByteArray並使用C對其進行排序的空本機擴展(ANE),其缺點是對於需要運行的所有平臺實現它更困難。

你會推薦什麼?你以前有過類似的經歷嗎?

回答

3

我會說使用Array或Vector對象,還有通過sort()對您通過sortOn()想要的任何鍵數組排序的可能性,和載體,這樣你就可以達到你需要的任何行爲,因爲後者接受一個函數作爲參數check here。我相信你不會在ByteArrays中獲得任何地方,因爲在排序對象時實際做的是排序鏈接,而ByteArray將包含實際的數據。

+0

缺點是實際的對象會比將原始數據存儲在ByteArray中佔用更多的空間。我需要在內存中保留數千(甚至數百)萬條記錄。 – Eduardo

+0

那麼,創建一個只包含公共變量的類,它將具有最小的開銷。我希望你會失去很多時間,試圖讓自己成爲一個ByteArray並將其快速排序,並通過索引檢索一段數據並將其設置回來。實際上,這樣的函數將包含遍歷到計算的位置,然後調用一個'readObject()'來檢索一條記錄,然後返回,每次(!)它都會嘗試一個類型強制。我猜它會比'Vector.sort()'慢很多,只節省8MB內存。 – Vesper

+0

是的,8MB意味着你有兩個地方爲1M個對象存儲4個字節的鏈接,一個在Vector中,另一個在所謂的「開銷」中,每個對象中都有一個Class類型的鏈接。將它與2-3個實例的記錄類,一個ByteArray以及一次強制調用相比較。另外,我不確定寫入ByteArray的數據是否等於字段大小的總和,可能會在其中寫入一些開銷信息,這表示該對象。即使如此,您記錄中的單個字符串也會讓您大失所望,因爲您無法快速獲取索引。 – Vesper

0

你不應該設計什麼,必須有成千上萬的東西在存儲器中的一次。卸載的東西,而你不需要它。你知道10萬是多少?取一個字節並乘以100,000就可以得到一個MB。對於記錄中的每1個字節的數據,您將生成1MB的內存。記錄100,000個整數需要4MB。

如果您的記錄有2個20字符串(第一個和最後一個名字),一個字符串的字符表示有8個字節,所以你剛纔填的內存640 MB的無非就是姓和名以上。大多數'壞'電腦都有,2GB的內存?好工作佔了1/4。即使您設法將這種截斷方式截斷爲ByteArray級別,但超級超級bitshifing,您仍然在談論減少數據的8倍。因此,現在您只有80MB的名字和姓氏,而沒有其他數據。你可以在那裏生存 - 除非我懷疑你的記錄有更多的數據,然後2個字符串。 20個字符串?你正在吃800MB的數據。一次只能卸載100條記錄,而對於這些名稱,則只有640KB的內存。是的,您可以在排序時加載和卸載。

內存塊不會複製比字節快。全部都是一樣。由於切換引用/指針/一個32位/ 64位數字而不是複製內存塊,因此對象的矢量表達式的原因是切換的原因。

目前尚不清楚您正在排序的內容。字節只能達到256的值,因此對於每條記錄顯然你使用的字節數多於1。你想要評估每一組......,比如2000+字節對2000+字節的每一組?像「啊,姓氏是字節32-83,所以提取這些字節,對於每個4字節組,將它們分別移位0,8,16,32位,將它們加在一起,將它們的整數值合併爲一個String,do比較,現在將字節84-124與下一個選項中的字節進行比較,現在將字節0-2000傳送到位置443530-441530,並且......這些記錄是否具有可變長度的字符串或數組?

Flash不是在彙編中寫入的地方!

使用對象並測試內存消耗速度&。如果任何一方都讓你哭泣,那就用更傳統的減輕負荷的方法;如將材料臨時卸載到文本文件中。你應該得到的最醜的是通過將每個單獨的屬性存儲在不同的Vector中來避免對象。矢量等,並且具有相同的索引是指全部記錄中的一個記錄。