2009-12-18 73 views
5

我在我的Windows窗體應用程序的工作目錄中存儲了大量存儲在XML文件中的數據,173 MB(460萬行)。這是將數據表寫入XML文件的結果。數據表原來是從查詢填充到SQL服務器的。尋找關於在本地磁盤上存儲數據的想法

我將它存儲在本地而不是從服務器請求它的原因是數據請求花費了40秒以上,並且有時超時並且數據是靜態的並且永遠不會改變,而且用戶可以脫機並仍然使用這些數據。

將文件加載回數據表需要20-30秒。我對從磁盤加載所花費的時間並不太擔心,因爲我讓用戶知道數據正在加載並且需要耐心。不過,我不喜歡XML文件格式,我正在尋找磁盤存儲的其他想法。

數據表只是用作收集對象的最終數量的中間人。如果你有要求,我想聽聽他們。

我希望遠離數據庫解決方案並傾向於採用二進制文件方式。下面是我的第一次嘗試,但我得到一個內存不足的異常:

byte[] b = null; 

using (MemoryStream stream = new MemoryStream()) 
{ 
    BinaryFormatter bformatter = new BinaryFormatter(); 
    bformatter.Serialize(stream, timeData); 
    b = stream.ToArray(); 
} 

using (FileStream fileStream = new 
    FileStream("brad.bin", FileMode.Create, FileAccess.Write)) 
{ 
    fileStream.Write(b, 0, b.Length); 
} 
+0

你能說你爲什麼「希望遠離數據庫解決方案走」?正如許多答覆者指出的那樣,這似乎是一個完美契合輕型本地數據庫的方法:如果您解釋了您認爲會導致錯誤的設計約束,也許人們可能會提出其他建議。 – itowlson 2009-12-18 22:39:23

+0

我只是希望避免它。它只是似乎很多工作去與很少的益處 – Brad 2009-12-18 22:44:52

+0

這是非常少的額外工作。 SQLite甚至將自己定義爲「零管理數據庫」。 – Joe 2009-12-19 08:47:19

回答

11

我會看一個緊湊(本地)數據庫,如SQL Server CESQLite。數據庫正是爲此而設計的。

+0

SQL CE完全集成到Visual Studio系列工具中,考慮到主數據庫是SQL Server,並且可以自由且可自由再分發,應該是最簡單的。 – 2009-12-18 22:27:02

+0

使用SQLite後,我喜歡它。你也可以使用LINQ。 – jcollum 2009-12-18 22:30:56

+0

SQLite的+1我現在已經在很多場景中使用過它,它非常棒。 – 2009-12-18 22:32:39

5

SQLite is pretty nice,你可以從各種斷開DB解決方案的選擇,但它確實取決於你想要投入它的工作和你的數據集。

1

如果您使用數據表作爲中間人,然後從那裏加載到集合中,那麼使用XMLSerialize直接加載到集合中怎麼樣?跳過中間人應該會給你一些性能提升。

0

所有...首先,這是一個醜陋的一段如下:P

關於你的問題,如果你使用的是.NET,爲什麼不SQL Server Compact(MDF文件)去?這就像使用SQL Server一樣,但數據存儲在一個文件中。

我個人認爲這是去的最佳途徑,但如果你想選擇的話,我想你可以考慮

  • Excel文件
  • 逗號分隔的文本文件
  • MS Access數據庫
+0

該死!我開始寫作時沒有答案!我想我應該以更快/更骯髒的方式發佈我的答案,然後編輯修復/增強/「優化」它們! – 2009-12-18 22:30:00

1

爲什麼應用程序請求每次整個數據集?如果你使用一個數據庫,你應該(恕我直言)是類似的處理數據庫,你堆...
- 請求,因爲它需要的是需要什麼樣的

某些操作可能需要在整個數據庫中的不同數據的比較,但這就是SQL的用途。在數據庫中執行這些操作,而不是在應用程序中執行。

您是否有一種用例情景,您絕對需要在內存中使用整個數據集?

2

如果可以從來沒有更改,爲什麼不直接提供應用程序安裝呢?

你對「永不改變」這個詞實際上意味着什麼感到困惑嗎?

至於本地存儲解決方案,有很多選擇,如SQLite這將允許您使用數據庫解決方案,即使在本地,也沒有任何安裝麻煩。

+0

我正在提供應用程序安裝。我想把它作爲一個資源文件。 – Brad 2009-12-18 22:55:11

+0

如果它真的永遠不會改變,並且爲它提供應用程序是一種可行的方法,我會考慮只安裝一個SQLite或類似的數據庫文件,或者讓應用程序在第一次運行時從頭開始構建該數據庫文件。我絕不會加載一個數兆字節的XML文件來加載數據,除非我需要它*全部*。如果我只需要部分數據,我會加載該部分,而不是其他任何東西,這意味着XML以外的其他東西(或者您將必須零碎地使用該XML來提取相關的部分)。 – 2009-12-18 22:59:13

+0

數據是歷史並用於創建性能數據圖表。數據將逐月向資源提供月份 - 程序將要求這些小數據。 SQLite只是一個文件而不是一個應用程序? - 因爲我可以只提供文件並讓程序根據需要追加文件 – Brad 2009-12-18 23:20:17

0

我不喜歡XML,但我認爲如果數據是完全只讀的,這就是要走的路。

我認爲儘管您在名稱中使用了Binary類,但您仍然可以將XML文本以標準XML文本格式寫入磁盤。打開它,看看。 (使用dd Unix工具(如果您沒有dd,請下載一些Unix工具)來抓取僅有前幾兆字節的示例文件,在寫字板或類似文件中打開它並查看。)

如果您想讓它不容易人類可讀,請考慮使用加密。

編輯

那是,如果你的工作站非常專注於任務和RAM堅持數據的173MB,並從工作,而不是擺弄與SQL發生,使良好的商業意識。

0

爲什麼不將數據留在服務器上並使用一些標準的DataSet緩存?創建一個返回180Mb數據的查詢聽起來像是一個設計問題。

我相信對歷史趨勢更合適的解決方案是隻檢索當前顯示的記錄。如果要放大圖表的一部分,請僅檢索放大的數據。

關於你的二進制序列化,你應該序列直接FileStream

using (FileStream fileStream = new 
    FileStream("brad.bin", FileMode.Create, FileAccess.Write)) 
{ 
    new BinaryFormatter().Serialize(fileStream, timeData); 
}