2016-06-16 6 views
-1

4GBファイルをロード中にメモリ例外が発生しました。私はそれを2回しなければならないが、私はそれらをロードするために忘れられない思い出を持っている。 。。私は3ギガバイトが残っ以上いるときmemmory例外がoccures :(メモリ例外HashSet

方法:

public TableModel LoadTable(string path) { 

     TableModel model = new TableModel(); 

     using (FileStream filestream = new FileStream(path, FileMode.Open, FileAccess.Read)) { 
      using (StreamReader reader = new StreamReader(filestream, Encoding.UTF8)) { 

       string line = ""; 
       bool isHeader = true; 
       int counter = 0; 
       List<string> rows = new List<string>(); 

       while ((line = reader.ReadLine()) != null) { 

        if (isHeader) { 
         model.Columns = line.Split(new string[] { "\t" }, StringSplitOptions.RemoveEmptyEntries); 
         isHeader = false; 
         continue; 
        } else { 
         if (Settings.Default.RonudSet != 0) { 
          rows.Add(RoundDecimals(line)); 
         } else { 
          rows.Add(line); 
         } 
        } 
        counter++; 
       } 
       model.RowCount = counter; 
       model.ColumnsCount = model.Columns.Length; 
       model.Keys = new HashSet<string>(rows); 
      } 
     } 
     return model; 
    } 

例外:

System.OutOfMemoryExceptionには、未処理だった 機能評価は、理由のうちの無効にされましたメモリ例外

するTableModel:。

class TableModel { 

    private string tableName; 
    private string[] columns; 
    private HashSet<string> keys; 

    public int ColumnsCount { get; set; } 
    public int RowCount { get; set; } 
    public string TableName { get { return tableName; } set { this.tableName = value; } } 
    public string[] Columns { get { return columns; } set { this.columns = value; } } 
    public HashSet<string> Keys { get { return keys; } set { this.keys = value; } } 
} 

スタートの比較:

if (newFile.Name.Equals(currFile.Name)) { 

        FileLoader loader = new FileLoader(); 
        TableModel newModel = loader.LoadTable(newFile.ToString()); 
        TableModel currentModel = loader.LoadTable(currFile.ToString()); 
        newModel.TableName = newFile.Name; 
        currentModel.TableName = currFile.Name; 
        new Compare(newModel, currentModel, currFile.Directory.Name); 
        break; 
       } 

は比較:

private void CheckColumns() { 

     bool sameColumnCount = CheckColumnsCount(); 
     int counter = 0; 
     currentContent = new HashSet<string>(currentModel.Columns); 
     newContent = new HashSet<string>(newModel.Columns); 

     foreach (string header in currentContent) { 
      if (!newContent.Contains(header)) { 
       headersNotFoundInN.Add(header); 
      } 
     } 
     foreach (string header in newContent) { 
      if (!currentContent.Contains(header)) { 
       headersNotFoundInC.Add(header); 
      } 
     } 
     if (currentModel.ColumnsCount == newModel.ColumnsCount) { 
      for (int i = 0; i < currentModel.ColumnsCount; i++) { 
       if (currentModel.Columns[i] == newModel.Columns[i]) { 
        counter++; 
       } 
      } 
      if (counter == currentModel.ColumnsCount) { 
       headerSequence = true; 
      } else { 
       headerSequence = false; 
      } 
     } else { 
      headerSequence = false; 
     } 
     bool emptyNotFoundIn = false; 
     if (headersNotFoundInC.Count == 0 && headersNotFoundInN.Count == 0) { 

      emptyNotFoundIn = true; 
     } 
     ReportContent(sameColumnCount, headerSequence, emptyNotFoundIn); 
    } 
    private void CheckRows() { 

     bool sameRowCount = CheckRowCount(); 
     currentContent = new HashSet<string>(currentModel.Keys); 
     newContent = new HashSet<string>(newModel.Keys); 

     foreach (string key in currentContent) { 
      if (!newContent.Contains(key)) { 

       rowNotFoundInN.Add(key); 
      } 
     } 
     foreach (string key in newContent) { 
      if (!currentContent.Contains(key)) { 

       rowNotFoundInC.Add(key); 
      } 
     } 
     bool emptyNotFoundIn = false; 
     if (rowNotFoundInC.Count == 0 && rowNotFoundInN.Count == 0) { 

      emptyNotFoundIn = true; 
     } 
     ReportContent(sameRowCount, emptyNotFoundIn); 
    } 

その私は同様の表と比較する必要があり、多くの行を持つテーブル。最後に、私は、diffrencesについてのレポートを与える必要があります。しかし、私はここでこの大量のファイルをロードする必要があります失敗します。 (BufferedStream BS =新しいBufferedStream(FILESTREAM))を使用してBufferedStream

を用い

+2

溶液は、メモリ内にすべてを格納しないであろう。どんな情報が本当に必要ですか? –

+0

クローズ中に例外がスローされ、テーブルに行(行)が追加されます – Ams1

+0

また、それは大きなテーブルであり、別のテーブルと比較する必要があります。既にこの用語を使用している場合は、大きなテキストファイルの代わりにデータベースを使用してください。 –

答えて