私は1つのファイルにたくさんの小さなXMLファイルを縫い合わせ、カスタム抽出プログラムを作成して各ファイルに対応する1バイト配列の行を返しました。 (gzipで圧縮され、11Mビット)一つのファイルのためのリモコンのOutOfMemory on custom extractor
- 実行/マスター
- 実行それは、それが正常に動作します。
- 複数のファイルを実行すると、System.OutOfMemoryExceptionが発生します。ローカル/マスター(500 + MBをgzip圧縮された)は、1つのまたは複数のファイルのための
- 実行それを
- 実行し、正常に動作します。
Extractorのは、次のようになります。
public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output)
{
using (var stream = new StreamReader(input.BaseStream))
{
var xml = stream.ReadToEnd();
// Clean stiched XML
xml = UtilsXml.CleanXml(xml);
// Get nodes - one for each stiched file
var d = new XmlDocument();
d.LoadXml(xml);
var root = d.FirstChild;
for (int i = 0; i < root.ChildNodes.Count; i++)
{
output.Set<object>(1, Encoding.ASCII.GetBytes(root.ChildNodes[i].OuterXml.ToString()));
yield return output.AsReadOnly();
}
yield break;
}
}
とエラーメッセージは次のようになります。
==== Caught exception System.OutOfMemoryException
at System.Xml.XmlDocument.CreateTextNode(String text)
at System.Xml.XmlLoader.LoadAttributeNode()
at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
at System.Xml.XmlDocument.Load(XmlReader reader)
at System.Xml.XmlDocument.LoadXml(String xml)
at Microsoft.Analytics.Tools.Formats.Text.XmlByteArrayRowExtractor.<Extract>d__0.MoveNext()
at ScopeEngine.SqlIpExtractor<ScopeEngine::GZipInput,Extract_0_Data0>.GetNextRow(SqlIpExtractor<ScopeEngine::GZipInput\,Extract_0_Data0>* , Extract_0_Data0* output) in d:\data\ccs\jobs\bc367467-ef86-43d2-a937-46ba2d4cc524_v0\sqlmanaged.h:line 1924
だから私は間違って何をやっていますか?リモートでこれをどのようにデバッグするのですか?
ありがとうございます!
あなたはメモリ例外の原因について正しいと思います。代わりにXmlReaderで作業するように私のカスタムエクストラクタを再コーディングしました。そして、ドキュメントをDOMにロードしないので問題はありません。 xmlは非常に素敵でクリーンではないので、XMLファイルと非常に深いxml構造の両方であるため、私は独自のエクストラクタを使用する必要があります。 ありがとうございました! – Anders