gpt4 book ai didi

c# - 超过 int.Maxvalue 时如何获取 xml 文件中的行号

转载 作者:数据小太阳 更新时间:2023-10-29 01:52:04 24 4
gpt4 key购买 nike

我无法在将近 300 GB 的 xml 文件中获取行号。 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());
}

}

最佳答案

你可以尝试的不多:

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;

真正可能的问题是,尽管您正确地存储了行号,但 XmlReader 的内部结构可能会开始崩溃。在我看来,checked 整数算术代码应该是默认代码,而不是像现在这样未经检查的 - 当溢出发生时,如果没有明确告知,类就会损坏。

2) 重新组织您的数据存储,以更分散的方式处理数据。
3) 编写您自己的使用 BigInteger 的 XmlReader。

关于c# - 超过 int.Maxvalue 时如何获取 xml 文件中的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24496705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com