在C#中使用非常庞大的XML文件

Ven*_*tus 7 c# xml

我有这个非常庞大的大小为2.8GB的XML文件.这是波兰维基百科的文章转储.这个文件的大小对我来说很成问题.任务是在此文件中搜索大量数据.我所拥有的只是文章的标题.我以为我可以对这些标题进行排序并在文件中使用一个线性循环.想法并不是那么糟糕,但文章按字母顺序排序.它们按ID分类,我不知道它是先验的.

所以,我的第二个想法是制作该文件的索引.以下列格式存储在其他文件(或数据库)行中:( title;id;index可能没有ID).我的另一个问题是我向你寻求帮助.假设是,如果我有所需标签的索引,我可以使用简单的Seek方法在文件中移动光标而不读取所有内容等.对于较小的文件,我认为这可以正常工作.但在我的电脑(笔记本电脑,C2D proc,Win7,VS2008)上我收到应用程序没有响应的错误.

在我的程序中,我正在从文件中读取每一行并检查它是否包含我需要的标记.我也在计算我读取的所有字节并以上述格式保存行.因此,虽然索引程序被挂断了.但到那时结果索引文件是36.2MB,最后一个索引是2,872,765,202(B),而整个XML文件是3,085,439,630 B长.

我的第三个想法是将文件分成更小的部分.准确地说是26件(拉丁语中有26个字母),每个字母只包含以相同字母开头的条目,例如在a.xml中所有条目以"A"字母开头的条目.最终文件将像数十MB,我认为最大约为200 MB.但是阅读整个文件存在同样的问题.

要读取我使用的文件可能是最快的方法:使用StreamReader.我在某个地方读到了这个StreamReaderXmlReaderSystem.Xml是最快的方法.StreamReader甚至更快XmlReader.很明显,我无法将所有这些文件加载​​到内存中.我只安装了3GB的RAM,Win7在满载时需要800MB-1GB.

所以我在寻求帮助.什么是最好的.关键是搜索此XML文件必须快速.必须更快,然后以HTML格式下载单个维基百科页面.我甚至不确定这是否可行.

也许将所有需要的内容加载到数据库中?也许那会更快?但我仍然需要至少阅读整个文件一次.

我不确定1个问题长度是否存在一些限制,但我还会在此处提供我的索引源代码示例.

while (reading)
{
    if (!reader.EndOfStream)
    {
        line = reader.ReadLine();
        fileIndex += enc.GetByteCount(line) + 2; //+2 - to cover characters \r\n not included into line
        position = 0;
    }
    else
    {
        reading = false;
        continue;
    }

    if (currentArea == Area.nothing)    //nothing interesting at the moment
    {
         //search for position of <title> tag
         position = MoveAfter("&lt;title>", line, position);    //searches until it finds &lt;title> tag
         if (position >= 0) currentArea = Area.title;
         else continue;
    }

    (...)

    if (currentArea == Area.text)
    {
         position = MoveAfter("&lt;text", line, position);
         if (position >= 0)
         {
              long index = fileIndex;
              index -= line.Length;
              WriteIndex(currentTitle, currentId, index);
              currentArea = Area.nothing;
         }
         else continue;
     }
 }

 reader.Close();
 reader.Dispose();
 writer.Close();
 }

 private void WriteIndex(string title, string id, long index)
 {
     writer.WriteLine(title + ";" + id + ";" + index.ToString());
 }
Run Code Online (Sandbox Code Playgroud)

最诚挚的问候和提前谢谢,

文图斯

编辑:链接到此Wiki的转储http://download.wikimedia.org/plwiki/20100629/

Ran*_*pho 7

嗯....如果你要搜索它,我强烈建议你找一个比处理文件本身更好的方法.我建议你提到将它放入一个规范化和索引编制的数据库中并在那里进行搜索.你做的任何其他事情都将有效地复制数据库的功能.

但是,这样做需要时间.XmlTextReader可能是你最好的选择,它一次只能运行一个节点.LINQ to XML也应该是一个相当有效的处理,但我没有尝试过大文件,因此无法评论.

请问:这个巨大的XML文件来自哪里?也许有一种方法可以在源头处理这种情况,而不是在处理3 GB文件之前.


Kha*_*uez 6

好吧,如果它符合您的要求,我会首先将此XML导入到SQL Server之类的RDMS中,然后针对此SQL Server进行查询.

使用正确的索引(全文索引,如果你想搜索大量的文本),它应该是非常快...

它将减少由库解析XML文件带来的大量开销......

  • @Ventus.这是唯一理智的方式.看看SQLLite,derby或其他一些嵌入式数据库解决方案. (2认同)