Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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# 查询非常大的xml文件_C#_Azure Data Lake_U Sql - Fatal编程技术网

C# 查询非常大的xml文件

C# 查询非常大的xml文件,c#,azure-data-lake,u-sql,C#,Azure Data Lake,U Sql,我有一个合并的非常大的xml文件,其规模为GB。我使用以下代码和xpath查询来读取和处理数据 IColumn column = output.Schema.FirstOrDefault(col => col.Type != typeof(string)); if (column != null) { throw new ArgumentException(string.Format("Column '{0}'

我有一个合并的非常大的xml文件,其规模为GB。我使用以下代码和xpath查询来读取和处理数据

           IColumn column = output.Schema.FirstOrDefault(col => col.Type != typeof(string));
        if (column != null)
        {
            throw new ArgumentException(string.Format("Column '{0}' must be of type 'string', not '{1}'", column.Name, column.Type.Name));
        }


        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ConformanceLevel = ConformanceLevel.Auto;//.Fragment;
        XmlReader r = XmlReader.Create(input.BaseStream, settings);
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(r);
        //xmlDocument.LoadXml("<root/>");

        //xmlDocument.DocumentElement.CreateNavigator().AppendChild(r);
        //xmlDocument.Load(input.BaseStream);

        XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDocument.NameTable);
        if (this.namespaces != null)
        {
            foreach (Match nsdef in xmlns.Matches(this.namespaces))
            {
                string prefix = nsdef.Groups[1].Value;
                string uri = nsdef.Groups[3].Value;
                nsmgr.AddNamespace(prefix, uri);
            }
        }

        foreach (XmlNode xmlNode in xmlDocument.DocumentElement.SelectNodes(this.rowPath, nsmgr))
        {
            foreach (IColumn col in output.Schema)
            {
                var explicitColumnMapping = this.columnPaths.FirstOrDefault(columnPath => columnPath.Value == col.Name);
                XmlNode xml = xmlNode.SelectSingleNode(explicitColumnMapping.Key ?? col.Name, nsmgr);
                output.Set(explicitColumnMapping.Value ?? col.Name, xml == null ? null : xml.InnerXml);
            }
            yield return output.AsReadOnly();
        }
IColumn column=output.Schema.FirstOrDefault(col=>col.Type!=typeof(string));
if(列!=null)
{
抛出新的ArgumentException(string.Format(“列“{0}”的类型必须为“string”,而不是“{1}”,Column.Name,Column.type.Name));
}
XmlReaderSettings设置=新建XmlReaderSettings();
settings.ConformanceLevel=ConformanceLevel.Auto;//。碎片;
XmlReader r=XmlReader.Create(input.BaseStream,设置);
XmlDocument XmlDocument=新的XmlDocument();
xmlDocument.Load(r);
//xmlDocument.LoadXml(“”);
//xmlDocument.DocumentElement.CreateNavigator().AppendChild(r);
//加载(input.BaseStream);
XmlNamespaceManager nsmgr=新的XmlNamespaceManager(xmlDocument.NameTable);
if(this.namespaces!=null)
{
foreach(在xmlns.Matches(this.namespace)中匹配nsdef)
{
字符串前缀=nsdef.Groups[1]。值;
字符串uri=nsdef.Groups[3]。值;
nsmgr.AddNamespace(前缀,uri);
}
}
foreach(xmlDocument.DocumentElement.SelectNodes中的XmlNode XmlNode(this.rowPath,nsmgr))
{
foreach(output.Schema中的IColumn列)
{
var explicitColumnMapping=this.columnPaths.FirstOrDefault(columnPath=>columnPath.Value==col.Name);
XmlNode xml=XmlNode.SelectSingleNode(explicitColumnMapping.Key??col.Name,nsmgr);
Set(explicitColumnMapping.Value??col.Name,xml==null?null:xml.InnerXml);
}
产生返回输出。AsReadOnly();
}
然而,它只适用于MBs规模的较小文件。它在本地运行良好,但在ADLA中失败。我还需要使用名称空间管理器。如何扩展它,以便处理更大的文件。在提交带有大文件的作业时,我总是在没有任何信息的情况下收到此错误

顶点失败错误


复制我在MSDN论坛上对同一问题给出的答案:

默认情况下,U-SQL提取器按比例扩展,以便在输入文件的较小部分(称为扩展数据块)上并行工作。每个扩展数据块的大小约为250MB

如果正在处理的数据无法放入数据块,则必须告诉具有C#属性的提取器,提取器必须查看整个文件。您可以通过在提取器类之前添加以下部分来完成此操作:

[SqlUserDefinedExtractor(AtomicFileProcessing = true)] 
现在在您的例子中,XML文档显然无法拆分,因为解析器需要查看文档的开头和结尾。如果您只有一个XML文档,则尤其如此(旁注:在我看来,拥有单个XML文档或JSON文档的GBs通常是个坏主意)


此外,我建议您查看我们在GitHub站点上提供的示例XML提取器:

这些文件加载到RAM中-您有足够的文件吗?在这种情况下,最好自己使用XmlReader,而不是将整个内容读入XmlDocument中。它提供了快速、仅向前的读取访问,您可以控制内存中的内容,而不是整个xml文档。这可能会使您想要执行的访问变得更加复杂,但您至少有很好的机会让它们工作。@GerardSexton,我有足够的RAM在本地处理它们,但我不确定ADL。该文件大约为2.7GB,我的本地RAM为32GB。有没有办法让我检查RAM等的工作。(附:对u-sql和ADL来说非常陌生)@moreON我今天会尝试,但是我必须注意名称空间前缀等。谢谢Micheal。是的,我从实验中猜到了。我遵循了git中的XMLReader示例,并对其进行了扩展,以支持用例的属性和名称空间。它在本地和ADL都非常有效。但是,由于原子文件处理行为,我们可能会放弃它。由于3000个文件的限制,数以百万计的小XML文件被合并成了GBs的大XML。如果您可以通过删除所有CR LF(或用字符实体用XML编码)来连接XML文档,并用CR LF将它们分开,那么您可以使用并行提取器,假设每个XML文档小于4MB。