我试图用" |"读取文本文件数据分开,我使用下面的代码。在尝试将数据表数据放入数据视图时,我能够在阅读后从文本文件中读取数据我得到类型' System.OutOfMemoryException' 的异常,
任何人都可以建议我如何避免这种例外。
string filepath = System.Configuration.ConfigurationManager.AppSettings["data"];
if (filepath != "")
{
DataTable dt = new DataTable("file");
string[] columns1 = null;
var lines = File.ReadAllLines(filepath);
int Count = lines.Length;
//here taking columns and adding to table
if (lines.Count() > 0)
{
columns1 = lines[0].Split(new char[] { '|' });
foreach (var column in columns1)
dt.Columns.Add(column);
}
for (int i = 1; i < lines.Count(); i++)
{
DataRow dr = dt.NewRow();
string[] values = lines[i].Split(new char[] { '|' });
for (int j = 0; j < values.Count() && j < columns1.Count(); j++)
{
dr[j] = values[j];
}
}
dt.Rows.Add(dr);
DataView View = new DataView(dt);
//Here I m getting "Exception of type 'System.OutOfMemoryException' was thrown."
DataTable MD = View.ToTable("MD", false, "ID", "Description")
DataTable MM = View.ToTable("MM", false, "RecordNumber", "Item description")
if (MD.Rows.Count > 0)
{
InsertData(MD);
}
if (MM.Rows.Count > 0)
{
InsertData1(MM);
}
}
StackTrace: -
at System.Collections.Generic.List`1.set_Capacity(Int32 value)
at System.Collections.Generic.List`1.EnsureCapacity(Int32 min)
at System.Collections.Generic.List`1.Add(T item)
at System.Data.DataView.ToTable(String tableName, Boolean distinct, String[] columnNames)
答案 0 :(得分:0)
String.Split的多次使用可能会导致OutOfMemoryException。下载Lumenworks快速CSV阅读器 - 问题解决了。你会在这里得到它:http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
有关Split问题的更多详细信息,请查看以下链接:
http://vpnchoudhary.blogspot.ie/2011/03/out-of-memory-exception-simple.html
string.split() "Out of memory exception" when reading tab separated file
相关引用:
对包含1355049逗号的字符串进行拆分时会发生什么情况 每个字符长度为16个字符的分隔字符串 25745930?
指向字符串对象的指针数组:连续的虚拟地址 空格4(地址指针)* 1355049 = 5420196(数组大小)+ 16(for 簿记)= 5420212。非连续的虚拟地址空间 1355049个字符串,每个54个字节。它并不意味着所有那些1.3 百万字符串将分散在整个堆中,但它们会分散 不在LOH上分配。 GC将在Gen0上的串上分配它们 堆。 Split.Function将创建System.Int32 []的内部数组 大小25745930,消耗(102983736字节)~98MB的LOH,非常 昂贵的L。