2010-11-04 98 views
1

有沒有人有關於在磁盤上存儲數據的經驗?我有一個內存建模應用程序,可以進行計算等。基本上,數據存儲爲對象列表,具有嵌套鍵值集合,如Dictionary < int,字典< int,T >>。磁盤存儲的陣列等

現在我使用SQL-Server作爲持久層,但我使用它的很少的功能。所以我想我可以自己寫入/讀取數據到磁盤,以減少依賴並簡化安裝。

所以我寫了一個小程序,以大致這種格式將每個數組寫入磁盤,其中「ObjId」,「Type」,「Valid」和「Count」字樣實際上並不在文件中,它們是第一,第二,第三和第四個int在字節[]中,然後來到< int,T>對。 52來自4 * 4 + 3 *(4 + 8)。 (4個字節整型,8雙)

Bytes: 52 

ObjId: 123 
Valid: 234 
Type: double 
Count: 3 
    1 .23 
    2 .34 
    3 .45 

在現實生活中有沒有壓痕等​​,他們是在一個長流中的所有連續的字節。

這很好,只寫一次。但是當我想在中間某處寫一個額外的值時,我必須重寫整個事情。另外我無法輕鬆更新單個值。

一種替代方法是將每個對象寫入單獨的文件,因此我只需重寫該對象。但是,這似乎效率很低,因爲我得到的文件是1kb,但磁盤上有4kB,所以我會浪費空間。

那麼,我需要做些什麼,才能在磁盤上增加寫入這個文件呢?我知道SqlServer有'網頁'它寫入數據,是否要走?

是否有任何圖書館準備去解決這類問題?也許有些虛擬文件可以讓我將它們當作單獨的byte []來處理,但將存儲作爲單個psysical文件處理?理想的情況下壓縮。(推,但誰知道。我以前也被提前:-)

感謝驚訝,

格特 - 揚

回答

2

如果你不想要一個RDBMS的開銷,你可以使用一個鍵 - 值數據庫一樣的Berkeley DB。這裏是它的一個C#接口位置:

Berkeley DB for .NET

你可以爲每個陣列的一個條目,只是重寫,當你需要。數據庫文件的其餘部分將保持不變,因此比重寫整個文件要快得多。

您可以在寫出數組時重用已經實現的序列化邏輯。您需要添加的是每個陣列的唯一鍵。

+0

嗨,謝謝!我知道BDB是一個mySql引擎,但從來沒有考慮過這個。我會在週末看看它。有一種方法只是把我的字節[]放在那裏,並得到它回來似乎幾乎我所尋找的。我寧願純粹的C#與源代碼,但這應該是成熟的技術,足以用作黑匣子。 – gjvdkamp 2010-11-05 18:15:12

1

你將無法得到解決每個對象具有1個文件,或者在進行更改時不得不重寫整個對象列表。您可以使用SQLite。它是一個非常快速和高效的單一文件嵌入式數據庫。這意味着你的應用程序在數據庫上沒有任何外部依賴關係。如果你直接寫數據,你應該在binary format.中讀寫數據。你將用一個字節而不是他們的ASCII表示來存儲你的整數(1234 = 4字節,但是是一個1字節的整數)。

這將加快讀取和寫入文件。

從文章中的一些代碼:

Hashtable addresses = new Hashtable(); 
    addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052"); 
    addresses.Add("Fred", "987 Pine Road, Phila., PA 19116"); 
    addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301"); 

    // To serialize the hashtable and its key/value pairs, 
    // you must first open a stream for writing. 
    // In this case, use a file stream. 
    FileStream fs = new FileStream("DataFile.dat", FileMode.Create); 

    // Construct a BinaryFormatter and use it to serialize the data to the stream. 
    BinaryFormatter formatter = new BinaryFormatter(); 
    try 
    { 
     formatter.Serialize(fs, addresses); 
    } 
    catch (SerializationException e) 
    { 
     Console.WriteLine("Failed to serialize. Reason: " + e.Message); 
     throw; 
    } 
+0

BinaryFormatter的一個小問題是生成的文件對於應用程序的程序集或.NET Framework都不具有版本容錯性。在技​​術上, – Alan 2010-11-04 23:25:20

+0

當然,1234太大而不能存儲在單個字節中。我希望你知道這一點,只是錯誤鍵入。 – 2010-11-04 23:29:02

+0

@高績效標誌 - 是的,我應該把255或其他東西。 – 2010-11-05 00:11:49

1

有一千種和一種在磁盤上存儲信息的方法。你已經有關於數據庫的建議。您可能還需要考慮結構化文件格式,例如HDF5,它具有包括C#在內的語言的綁定。 HDF5的優勢之一是它支持存儲n維陣列。

0

除了在這裏提出的其他建議,您可以嘗試MongoDB與NORM作爲一個偉大的,無摩擦的(無需配置數據庫,無需創建對象關係映射)存儲數據的方式,而無需SQL Server的開銷/成本。