簡體   English   中英

實現預計算數據的最佳方式是什么?

[英]What is the best way to implement precomputed data?

我有一個計算,可以根據某些輸入計算得到的百分比。 但是這些計算可能需要相當長的時間,這可能很煩人。 由於大約有 12500 個可能的輸入,我認為預先計算所有數據並在正常程序執行期間查找這些數據是個好主意。

我的第一個想法是創建一個在程序初始化時讀取並填充一些 arrays 的簡單文件。 雖然這會起作用,但我想知道是否還有其他選擇? 例如,在編譯期間填充數組。

順便說一句,我在 C# 中編寫我的代碼。

本教程在這里實現了一個序列化程序,您可以使用它輕松地將 object 轉換為二進制文件並返回。 一旦你有了序列化器,你就可以創建一個 object 來保存你的所有數據並序列化它; 當您實際運行程序時,只需反序列化 object 並使用它。

這具有將 object 保存到硬盤驅動器的所有好處,其實現與對象無關(這意味着您不必為要序列化的任何 object 編寫太多代碼)和二進制輸出(從而節省空間,如果這是一個問題)。

包含數據的文件可能是實現它的最簡單和最靈活的方式。

如果您希望它在 memory 中而不必從某處讀取它,我會編寫一個程序到 output 您的數據在 C#-like CSV 格式適合於初始復制/收集的代碼數據。

創建一個程序,輸出有效的 C# 代碼,用於初始化您的查找表。 將這部分作為構建過程的一部分,以便它自動創建源文件,然后構建項目的 rest。

我總是首先考慮是否有任何方法可以避免預先計算。 如果有 12500 個可能的輸入,每個用戶請求需要多少個? 會同時需要所有 12500 還是會及時分散? 如果你可以一次計算幾個,我會用延遲初始化來做到這一點。 我更喜歡這個解決方案只是因為從長遠來看我會遇到更少的問題。 當持久化格式改變或數據改變時你會怎么做。 當文件丟失或損壞時,您將如何處理? 持久化到文件不會創建更少的代碼。

如果我必須保留預加載的版本,我會將這樣的文件序列化為人類可讀的格式。 我可能會使用xml 序列化,因為它很簡單。 但經常存在無效和重新計算的問題。 這些值是從不改變還是很少改變?

正如 Daniel Lew 所說,將其序列化為二進制文件。
如果您需要速度,請使用 go 獲取字典。 字典是根據它的鍵索引的,即使有大量數據也應該允許快速查找。

我同意 mquander 和 Trent 的觀點。 使用您喜歡的語言或腳本生成定義數據所需的整個 C# 文件(無需復制粘貼,這是手動步驟且容易出錯)。 在 Visual Studio 中將其添加為 Pre-Build 事件。 您甚至可以檢測到您有一個最新的文件,並避免在大多數構建中重新生成。

在 C++ 中,肯定有一種使用模板元編程靜態生成幾乎所有數據的方法,盡管它可能會很痛苦。 除非您在程序的幾個部分中需要許多不同的數據集,否則這是不值得的。 我對 C# 中的元編程不夠熟悉,無法評估您案例中的一般工作。 你應該調查一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM