2017-06-05 85 views
0

我有一個巨大的.csv文件,具體爲.TAB文件,2900萬行,文件大小約爲600 MB。我需要將其讀入IEnumerable集合。如何用2900萬行數據讀取巨大的CSV文件使用.net

我已經試過CsvHelperGenericParser,以及一些其他的解決方案,但始終以內存溢出異常結束了

請提出一個辦法做到這一點

我已經試過

var deliveryPoints = new List<Point>(); 

using (TextReader csvreader1 = File.OpenText(@"C:\testfile\Prod\PCDP1705.TAB")) //StreamReader csvreader1 = new StreamReader(@"C:\testfile\Prod\PCDP1705.TAB")) 
using (var csvR1 = new CsvReader(csvreader1, csvconfig)) 
{ 
    csvR1.Configuration.RegisterClassMap<DeliveryMap>(); 
    deliveryPoints = csvR1.GetRecords<Point>().ToList(); 
} 

using (GenericParser parser = new GenericParser()) 
{ 
    parser.SetDataSource(@"C:\testfile\Prod\PCDP1705.TAB"); 

    parser.ColumnDelimiter = '\t'; 
    parser.FirstRowHasHeader = false; 
    //parser.SkipStartingDataRows = 10; 
    //parser.MaxBufferSize = 4096; 
    //parser.MaxRows = 500; 
    parser.TextQualifier = '\"'; 

    while (parser.Read()) 
    { 
     var address = new Point(); 
     address.PostCodeID = int.Parse(parser[0]); 
     address.DPS = parser[1]; 
     address.OrganisationFlag = parser[2]; 
     deliveryPoints.Add(address); 
    } 
} 

var deliveryPoints = new List<Point>(); 
csvreader = new StreamReader(@"C:\testfile\Prod\PCDP1705.TAB"); 
csv = new CsvReader(csvreader, csvconfig); 

while (csv.Read()) 
{ 
    var address = new Point(); 
    address.PostCodeID = int.Parse(csv.GetField(0)); 
    address.DPS = csv.GetField(1);     
    deliveryPoints.Add(address); 
} 
+5

在所有這些情況下,您確定您正在傳輸結果,而不是將它們全部放入列表或某些類似的內存數據結構中?例如,請顯示您正在使用的CsvHelper代碼。 –

+0

var Points = new List (); 使用(的TextReader csvreader1 = File.OpenText(@ 「C:\ testfile的\ PROD \ PCDP1705.TAB」)) 使用(VAR csvR1 =新CsvReader(csvreader1,csvconfig)) { csvR1.Configuration.RegisterClassMap () ; deliveryPoints = csvR1.GetRecords ().ToList(); } – Leya

+4

請*編輯問題*而不是在代碼中放置問題。但正如我懷疑的那樣,您試圖一次加載所有數據。這不同於「我需要閱讀這個IEnumerable集合」,這意味着你可以流式傳輸。 –

回答

-1

它的工作在64位模式下運行,並通過增加的app.config <gcAllowVeryLargeObjects enabled="true" />

+1

你沒有糾正問題的原因,你只是繞過它 - 暫時!你應該真的考慮@jdweng的答案 - 它擴展性好,不會咀嚼你的資源到達那裏! – Monza

1

不需要你se第三方軟件。使用網絡庫的方法

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      StreamReader csvreader = new StreamReader(@"C:\testfile\Prod\PCDP1705.TAB"); 
      string inputLine = ""; 
      while ((inputLine = csvreader.ReadLine()) != null) 
      { 
       var address = new Point(); 
       string[] csvArray = inputLine.Split(new char[] { ',' }); 
       address.postCodeID = int.Parse(csvArray[0]); 
       address.DPS = csvArray[1]; 
       Point.deliveryPoints.Add(address); 
      } 
     } 
    } 
    public class Point 
    { 
     public static List<Point> deliveryPoints = new List<Point>(); 
     public int postCodeID { get; set; } 
     public string DPS { get; set; } 

    } 
} 
+0

謝謝jdweng。我已經嘗試過上述解決方案,但它在1600萬條記錄中因內存不足而異常崩潰 – Leya

+0

以前從未見過這種情況。這是非常基本的代碼。你幾歲?嘗試運行Task Manage打開,看看這個應用程序是否佔用了內存或PC上的其他內容。 – jdweng