我无法在近300 GB的xml文件中获取linenumber.IXmlLineInfo.LineNumber是一个int32,当它超过int.MaxValue时,返回一个负数.如果我使用int或long来存储亚麻布,那就没有区别了.Xmlreader能够读取到eof.使用.net 2.0和最新版本也使用int32.
public void ReadLines()
{
long readcounter = 0;
long linenumber = 0;
fname = "I:\\XML Files\\europe-latest.osm";
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.XmlResolver = null;
XmlReader reader = XmlReader.Create(fname, settings);
IXmlLineInfo lineInfo = ((IXmlLineInfo)reader);
try
{
while (reader.Read())
{
linenumber = lineInfo.LineNumber;
readcounter++;
if (readcounter % 1000000 == 0) Console.WriteLine(linenumber.ToString());
}
}
catch (XmlException ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
finally
{
reader.Close();
Console.WriteLine(DateTime.Now.ToLongTimeString());
}
}
Run Code Online (Sandbox Code Playgroud)
您可以尝试的不多:
1)使用System.Numerics.BigInteger存储实际行号 - 每次操作后检查行号是否小于之前的行号,同时将实际行号存储在BigInteger中。好吧,在一个非常大的文件中,它实际上可能会溢出并变得比以前更大(例如,在读取后,以很少的内部增量读取 50 亿行元素):
var actualLine = new System.Numerics.BigInteger(0);
Int32 lastInt32Line = lineInfo.LineNumber;
// Some Xml reading
Int32 diff = lineInfo.LineNumber - lastLine;
// If an overflow has happened - add overflow
if (diff >= 0)
actualLine += (new BigInteger(Int32.MaxValue)) * 2 - diff;
else // Everything is normal - add the diff
actualLine += diff;
Run Code Online (Sandbox Code Playgroud)
真正可能的问题是,尽管您正确存储了行号,但 XmlReader 的内部结构可能会开始崩溃。在我看来,checked整数算术代码应该是默认的,而不是像现在这样未经检查的代码 - 当发生溢出时,如果没有明确告知,那么该类就会被损坏。
2)重新组织数据存储,以更加碎片化的方式处理数据。
3) 编写您自己的使用 BigInteger 的 XmlReader。
| 归档时间: |
|
| 查看次数: |
742 次 |
| 最近记录: |