2010-07-21 41 views
5

對不起,有些令人困惑的標題。不確定如何標題。我的情況是這樣的 - 我有一個學術仿真工具,我正在開發Web前端。雖然基於C++的模擬器在小型系統的計算上效率很高(幾百分之一秒到十分之一運行時),但它可以產生一個重要的數據量(約4-6mb)。如何處理服務器端模擬的大型數據集 - >客戶端瀏覽器

目前的設置如下 -

  1. 用戶訪問index.html文件。此頁面左側有一個交互式表單,用戶可以在其中輸入模擬參數。右側是他們正在創建的系統的表示,以及用於各種模擬數據圖的灰色標籤。
  2. 用戶點擊「運行模擬」。這通過AJAX調用將請求的sim參數提交給runSimulation.php文件。 runSimulation.php根據提交的數據創建一個輸入文件,然後使用這個輸入文件運行模擬器。模擬器在各種輸出文件中分出4-6mb的數據。
  3. 一旦模擬運行完畢,對瀏覽器的響應是另一個調用文件returnData.php的javascript函數。這個PHP腳本將輸出文件中的數據打包爲JSON數據,將JSON數據返回給瀏覽器,然後刪除數據文件。
  4. 然後將此響應數據反饋給瀏覽器javascript中的一些繪圖對象,並且繪圖選項卡變爲活動狀態。用戶然後可以打開並與繪製的數據交互。

這種設置工作正常,但是我遇到了兩個問題:

  • 返回數據是回來可能需要一段時間來加載的慢4-6mb。 (該數據正在被gzip壓縮,大大減少了它的側面,但在較慢的連接上仍然需要20多秒)
  • 下一個目標是允許用戶繪製多個模擬運行,以便他們可以比較結果。

我的想法是,我可能想保持數據文件在服務器上,而用戶會話是活動的。這將使得能夠僅加載用戶想要查看的圖的數據(並且當他們查看當前圖的結果時可能在後臺加載其他數據)。對於多次運行,我可以在服務器上安裝多個數據集,以備用戶在需要時下載。

但是,我有這個思路的大問題 - 我如何識別(在PHP中)用戶已經離開服務器,並刪除數據?我不希望用戶接管機器上的驅動器空間。有關這種Web應用程序的最佳實踐的任何想法?

回答

1

對於問題1,你沒有任何選擇。您已經使用了Gziping數據,並使用JSON,這是一種相對輕量級的格式。 4〜6 MB的數據確實很多。順便說一句,如果您認爲PHP生成數據所用的時間太長,您可以使用C++程序生成數據並使用PHP進行服務。你可以使用exec()來做到這一點。

然而,我不知道你的模擬是如何工作的,但JavaScript是一種圖靈完備的語言,所以你可能產生一些/大多數/所有客戶端上的這個數據(無論更有意義)的。在這種情況下,您將節省大量帶寬並顯着減少加載時間 - 但要注意JS可能非常慢。

對於問題#2,如果將數據留在服務器上,則需要跟蹤活動會話(即:用戶最後一次與服務器進行交互的時間),並設置適合於你的申請。超時後,您可以刪除數據。

爲了跟蹤交互,可以使用JS來檢查用戶是否活動(通過發送heartbeats或類似的東西)。

相關問題