Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将元素结束到结尾。就您的目的而言,单独使用批处理可能已经足够缓解了这一问题,但如果没有,您可能希望单独使用此方法,可能使用LINQ to XML以外的其他工具来编写结果,这样您就不需要将整个文件加载到内存中来创建这一个文档。_C#_Xml_Linq_File Io - Fatal编程技术网

C# 将元素结束到结尾。就您的目的而言,单独使用批处理可能已经足够缓解了这一问题,但如果没有,您可能希望单独使用此方法,可能使用LINQ to XML以外的其他工具来编写结果,这样您就不需要将整个文件加载到内存中来创建这一个文档。

C# 将元素结束到结尾。就您的目的而言,单独使用批处理可能已经足够缓解了这一问题,但如果没有,您可能希望单独使用此方法,可能使用LINQ to XML以外的其他工具来编写结果,这样您就不需要将整个文件加载到内存中来创建这一个文档。,c#,xml,linq,file-io,C#,Xml,Linq,File Io,您需要花费大量时间重新打开XML文件并将其解析为XDocument对象。由于这些Uber文件将非常大,所以您要做的是打开它们一次,然后以仅向前的方式写入。下面的代码是一个示例,说明了如何进行此操作。我还移动了从内部循环中获取eventType(因为它不依赖于内部循环变量) 请注意,此示例每次都将从头开始重新创建Uber文件。如果这不是您要做的,我建议您使用下面的代码创建“临时”文件,然后使用两个XmlReader实例读取文件,并将内容与XmlWriter合并,而不是将其读入XDocument u

您需要花费大量时间重新打开XML文件并将其解析为
XDocument
对象。由于这些Uber文件将非常大,所以您要做的是打开它们一次,然后以仅向前的方式写入。下面的代码是一个示例,说明了如何进行此操作。我还移动了从内部循环中获取
eventType
(因为它不依赖于内部循环变量)

请注意,此示例每次都将从头开始重新创建Uber文件。如果这不是您要做的,我建议您使用下面的代码创建“临时”文件,然后使用两个
XmlReader
实例读取文件,并将内容与
XmlWriter
合并,而不是将其读入
XDocument

using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Linq;

public static void Main(string[] args)
{
    string sourceDir = @"C:\splitXML\results\XML\";
    string xmlDestDir = @"C:\results\XMLSorted\";
    string[] events = { "Creation", "Assignment", "Modification", "Repair", "RepairReview", "Termination", "Test" };
    Dictionary<string, XmlWriter> writers = events.ToDictionary(e => e, e => XmlWriter.Create(Path.Combine(xmlDestDir, e + "Uber.xml")));

    foreach(var writer in writers.Values)
    {
        writer.WriteStartDocument();
        writer.WriteStartElement("PCBDatabase");
    }

    foreach(var file in Directory.EnumerateFiles(sourceDir, "*.xml", SearchOption.AllDirectories)) //roughly 13k files
    {
        XDocument xd = XDocument.Load(file);    
        var actionEvents = from e in xd.Descendants("PCBDatabase").Elements() select e;
        string eventType = (from e in actionEvents.Elements() select e.Name.ToString()).First();

        foreach(XElement actionEvent in actionEvents)
        {
            actionEvent.WriteTo(writers[eventType]);
        }    
    }

    foreach(var writer in writers.Values)
    {
        writer.WriteEndElement();
        writer.WriteEndDocument();
        writer.Close();
    }            
}
使用System.IO;
使用System.Xml;
使用System.Xml.Linq;
使用System.Linq;
公共静态void Main(字符串[]args)
{
字符串sourceDir=@“C:\splitXML\results\XML\”;
字符串xmlDestDir=@“C:\results\xmlsordered\”;
字符串[]事件={“创建”、“分配”、“修改”、“修复”、“修复审核”、“终止”、“测试”};
Dictionary writers=events.ToDictionary(e=>e,e=>XmlWriter.Create(Path.Combine(xmlDestDir,e+“Uber.xml”));
foreach(writers.Values中的var writer)
{
writer.WriteStartDocument();
WriteStarteElement(“PCBDatabase”);
}
foreach(Directory.EnumerateFiles(sourceDir,*.xml,SearchOption.AllDirectories)中的var文件)//大约13k个文件
{
XDocument xd=XDocument.Load(文件);
var actionEvents=来自xd.substands(“PCBDatabase”)中的e。Elements()选择e;
string eventType=(从actionEvents.Elements()中的e选择e.Name.ToString()).First();
foreach(actionEvents中的XElement actionEvent)
{
actionEvent.WriteTo(writers[eventType]);
}    
}
foreach(writers.Values中的var writer)
{
writer.writeedelement();
writer.WriteEndDocument();
writer.Close();
}            
}

写入结果文件(更重要的是,每次要添加元素时都要加载它)确实是让你头疼的事情。将所有要写入内存的数据存储在内存中也是有问题的,如果没有其他原因,那么您可能没有足够的内存来执行此操作。你需要一个中间地带,这意味着分批处理。读入几百个元素,将它们存储在内存中的一个结构中,然后一旦它变得足够大(尝试更改批处理大小,看看什么效果最好),将它们全部写入输出文件。在这里大声思考,但我想知道如果你使用
Uber
a,是否会获得更好的性能。一些关于MMF的。谢谢你们的回答,伙计们,我会尝试实施你们的想法,看看我能得到什么样的效率改进。FWIW,我有一台8 proc XEON 3.33 GHz、16GB的机器(专为这类问题而购买),你总是想附加到“Uber”xml文件吗?使用您的代码,Uber文件只在第一次创建,然后在以后每次运行它时,所有内容都会再次附加。这似乎很奇怪。我原以为您每次都要覆盖它们,或者只向uber xml文件追加新项。@mikezYes,我总是需要追加,而不是写入整个文件。我是否遗漏了一些愚蠢的东西,比如xeDoc.Append(destFile)?考虑到他正在处理的数据量,他可能没有足够的内存来做这件事。@Servy补充了另一个解决方案。哈!画家施莱米尔正是我所做的!谢谢你的奇闻轶事。@xanatos谢谢你的帮助,我很感激,尤其是这个故事(我今天早上在《站起来》中用它来博得大家的笑声)。哇,哇。您的方法在不到两分钟的时间内写出了整个300+GB的数据结构!我不得不做一些细微的调整,因为我希望数据是可读的,所以我在XMLWriter中添加了一些格式。从所有建议中可以学到很多东西,但我选择了您的解决方案,因为我能够立即实现它,而且它的工作效果比我的好得多(在对较小的数据集进行多次测试后,我将它关闭运行了近30个小时,以运行您的解决方案)。谢谢你的帮助,我真的很感激,我学到了一些很酷的LINQ新用法。事实证明,在过去的几天里,我已经运行了几十次了(坏数据)。如果没有你的解决方案,我将是索尔。我只是想再次表示感谢。@delliottg很高兴我能帮上忙。谢谢你的帮助,当mikez提出他的解决方案时,我正在研究你的建议,试图让它们发挥作用,我几乎立刻就能够实施了。我也计划学习你的方法,因为我认为其中有一些好的概念需要我学习,特别是SelectMany LINQ,这是我以前从未见过的。再次感谢。
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int batchSize)
{
    List<T> buffer = new List<T>(batchSize);

    foreach (T item in source)
    {
        buffer.Add(item);

        if (buffer.Count >= batchSize)
        {
            yield return buffer;
            buffer = new List<T>(batchSize);
        }
    }
    if (buffer.Count >= 0)
    {
        yield return buffer;
    }
}
var batchesToWrite = sourceList.SelectMany(file =>
        XDocument.Load(file).Descendants("PCBDatabase").Elements())
    .Select((element, index) => new
    {
        element,
        index,
        file = Path.Combine(xmlDestDir, element.Elements().First().Name + "Uber.xml"),
    })
    .Batch(batchsize)
    .Select(batch => batch.GroupBy(element => element.file));
foreach (var batch in batchesToWrite)
{
    foreach (var group in batch)
    {
        WriteElementsToFile(group.Select(element => element.element), group.Key);
    }
}
private static void WriteElementsToFile(IEnumerable<XElement> elements, string path)
{
    XElement xeDoc = XElement.Load(path);
    foreach (var element in elements)
        xeDoc.Add(element);
    xeDoc.Save(path);
}
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Linq;

public static void Main(string[] args)
{
    string sourceDir = @"C:\splitXML\results\XML\";
    string xmlDestDir = @"C:\results\XMLSorted\";
    string[] events = { "Creation", "Assignment", "Modification", "Repair", "RepairReview", "Termination", "Test" };
    Dictionary<string, XmlWriter> writers = events.ToDictionary(e => e, e => XmlWriter.Create(Path.Combine(xmlDestDir, e + "Uber.xml")));

    foreach(var writer in writers.Values)
    {
        writer.WriteStartDocument();
        writer.WriteStartElement("PCBDatabase");
    }

    foreach(var file in Directory.EnumerateFiles(sourceDir, "*.xml", SearchOption.AllDirectories)) //roughly 13k files
    {
        XDocument xd = XDocument.Load(file);    
        var actionEvents = from e in xd.Descendants("PCBDatabase").Elements() select e;
        string eventType = (from e in actionEvents.Elements() select e.Name.ToString()).First();

        foreach(XElement actionEvent in actionEvents)
        {
            actionEvent.WriteTo(writers[eventType]);
        }    
    }

    foreach(var writer in writers.Values)
    {
        writer.WriteEndElement();
        writer.WriteEndDocument();
        writer.Close();
    }            
}