2012-03-22 220 views
2

我需要在一個非常大的表或矩陣上執行計算和操作,它將有大約7500行和30000列。代表一個巨大的矩陣/表

矩陣數據如下所示:

Document ID | word1 |字2 |字3 | ... |字30000 |文檔分類
0032 1 0 0 1 P

換句話說,絕大多數單元格將包含布爾值(0和1)。

即需要做將期運用詞幹或特徵選擇(通過使用減少技術減少字的數量)的計算,以及計算每個類或每個字等

我要記住設計一個用於表示矩陣的OOP模型,然後將對象序列化到磁盤,以便稍後重用它們。例如,我將爲每個行或每列創建一個對象,或者爲另一個類中包含的每個交集創建一個對象。

我想過用XML表示它,但文件大小可能會有問題。

我可能會坐在鍋裏想念我的方法 - 我在正確的道路上,還是會有任何更好的表現方式來操縱這樣的大型數據收集。

這裏的關鍵問題是性能(反應時間等),以及數據的冗餘和完整性,顯然我需要將數據保存在磁盤上。

+0

請不要用「C#」等來標題。這就是標籤的用途。 – 2012-03-22 15:04:17

+0

這是一個7500 x 30000數字的矩陣,還是代表更復雜的東西?對你的問題的任何好的答案取決於有關這個表或矩陣的內容和結構的更多輸入。 – 2012-03-22 15:08:23

+0

29998列將包含1或0,其餘兩列將包含字符串。 – petestar 2012-03-22 15:39:17

回答

3

你沒有解釋你需要在表格/矩陣上進行計算的性質,所以我不得不在這裏做假設,但是如果我正確地讀了你的問題,這可能是一個海報 - 用於關係數據庫的子案例 - 即使您的數據庫中沒有任何實際關係。如果您不能使用完整的服務器,請使用SQL Server Compact Edition作爲嵌入式數據庫,這將允許您以編程方式控制.SDF文件(如果選擇)。

編輯:
第二考慮之後,我收回我的建議的數據庫。這完全是由於表中的列數,因此您使用的任何關係數據庫都會對此有嚴格的限制,而且我沒有看到一種解決方法並不令人驚訝。

根據您的編輯,我會說,有三件事情你有興趣:

  1. 一種方法來分析的話中的文檔存在。這是您的示例數據文件的主體,主要是表示文檔中是否存在單詞的布爾值。
  2. 單詞本身。這主要包含在示例數據文件的第一行中。
  3. 識別文件及其分類的方法。這是數據文件的第一列和最後一列。

思考了一點點之後,這是我會怎樣你的數據模型:

  1. 用字存在的情況下,我覺得這是最好的避免複雜的對象模型。你想要在兩個方向上進行純粹的計算(按列和按行),並且在我看來最靈活和潛在的高性能結構是簡單的bool字段的二維數組,如下所示:

    var wordMatrix = new bool [numDocuments,numWords];

  2. 單詞本身應該在一個數組或列表string s中,該數組或列表與索引鏈接到單詞矩陣的第二列 - 在上例中由numWords定義。如果您需要快速搜索特定單詞,則可以使用Dictionary<string, int>,以鍵爲單詞並將值作爲索引,以快速查找特定單詞的索引。

  3. 文檔標識將類似地位於索引鏈接到第一列的數組或列表中int。我假設文檔ID是那裏的整數值。分類將是一個類似的數組或列表,儘管我使用表示分類的每個可能值的列表enum。與單詞搜索一樣,如果您需要按ID搜索文檔,則可以將Dictionary<int, int>用作搜索索引。

我做了幾個假設這種模式,特別是你想做的事在各個方向,而不是「每個文檔」這個詞存在純粹的計算。如果我錯了,更簡單的方法可能是刪除二維數組和模型文檔,即一個C#Document類,其中DocumentIdDocumentClasification字段以及一組簡單的索引鏈接的布爾值到單詞列表。然後,您可以使用這些Document對象的列表以及單獨的單詞列表。

一旦你有一個你喜歡的數據模型,將它保存到磁盤是最簡單的部分。只需使用C#序列化。您可以通過XML或二進制文件保存它,您的選擇。二進制會給你最小的文件大小,自然地(我想有點超過200MB加上30000字的列表大小)。如果包含字典查找索引,可能需要額外的120kB。

+0

爲什麼你認爲數據庫將是一個好主意? – jalf 2012-03-22 15:28:49

+0

SQL服務器能夠容納一個大的表嗎? – petestar 2012-03-22 15:30:10

+0

行是沒有問題的,但列會是一個問題,我不幸沒有想到,當我提出這個建議。 – Randolpho 2012-03-22 15:33:54