2010-12-06 71 views
2

用JavaScript處理大型數據集(100K)的一些更好的解決方案是什麼?特別是,如果您具有多列排序和搜索功能,您如何處理數據提取(和預取),客戶端模型綁定(用於顯示)以及緩存數據。用JavaScript處理大型網格數據集

我會想象一個好的解決方案會在後臺做一些周到的工作。例如,如果表最初顯示N個項目,它可能會獲取2N個項目,爲用戶返回數據,然後在後臺獲取下一個2N項目(即使用戶沒有請求此項目)。隨着用戶進行搜索/排序更改,它會拋出(甚至可能緩存初始基本情況),並執行類似的功能。

你能分享你見過的最好的解決方案嗎?

謝謝

+2

您是否認爲向用戶顯示100k行是一種很好的用戶體驗? – jfar 2010-12-06 17:17:53

+0

@jfar:如果用戶詢問了100k行,那麼**是**,絕對顯示它們。過去我使用過一種產品,它將其數據網格顯示限制爲2,000條記錄,這令人難以置信地令人沮喪。 – josh3736 2010-12-06 18:38:08

回答

1

這取決於如何使用數據。

對於瀏覽器的Find函數足夠大的大型數據集,只需返回一個直接的HTML表格就很有效。加載需要一段時間,但顯示器對較慢的較慢客戶端有響應,並且您不必擔心會中斷。

當客戶端進行了排序和搜索,並且您沒有一次性顯示整個表格時,我讓服務器通過XMLHTTPRequest發送製表符分隔的表格,在瀏覽器中用list = String.split(' \ n'),並重復調用$('node')來更新顯示。innerHTML ='blah'。 JS引擎可以非常有效地存儲長字符串。在客戶端上運行速度比顯示,隱藏和重新排列DOM節點快得多。動態地創建和銷燬新的DOM節點結果非常緩慢。將每一行按需分割成字段似乎都行得通;我沒有嘗試過這種自由度。

我從來沒有嘗試過明顯的預取&背景技巧,因爲這些其他方法運行良好。

3

使用一個jQuery表插件像數據表:http://datatables.net/

它支持的服務器端處理排序,過濾,和尋呼。它包括流水線支持預取的記錄下一個x頁:http://www.datatables.net/examples/server_side/pipeline.html

其實數據表插件適用於四種不同的方法: 1. HTML表,所以你可以發下來一串HTML的,然後讓所有的排序,篩選和分頁工作客戶端。 2.使用JavaScript數組,您可以發送2D數組,讓它從那裏創建表格。 3. Ajax源代碼 - 這不適用於你。 4.服務器端,您將JSON格式的數據發送到空表,並讓DataTables從那裏接收數據。

2

既然你用Ext JS標記了這個,如果你還沒有看到它,我會指給你Ext.ux.LiveGrid。源代碼可用,所以你可以看一看他們是如何解決這個問題的。這是Ext JS世界中廣受歡迎和廣泛使用的擴展。有了這個說法,我個人認爲(虛擬)加載那麼多的數據作爲用戶體驗是沒有用的。手動拉動滾動條(每個像素跳過數百條記錄)是一種遠低於單純輸入所需內容的體驗。我更喜歡一些強大的過濾/搜索,而不是向用戶展示那麼多的數據。

如果你去谷歌和,而不是一個搜索框,它只是加載整個互聯網進入,你必須滾動來找到你的網站一個長期的虛擬列表... :)

3

SlickGrid不正是你在找什麼。 (Demo

使用AJAX數據存儲,SlickGrid可以處理數百萬行而不會退縮。