2009-03-31 11 views
10

私はそれを分割したいと思う15 GBのXMLファイルを持っています。それには約3億の行があります。それは相互に依存しているトップノードを持っていません。大きなファイルのXML分割

+0

あなたはそれについてvtd-xmlを見ましたか? –

答えて

3

私はあなたがプログラムでそれを行うことに興味がない限り、あなたは手動で分割する必要があると思います。 Here's a sampleこれはそうですが、処理されるXMLファイルの最大サイズについては言及していません。手動で行う場合、最初に発生する問題は、ファイル自体を開く方法です。

非常に単純なテキストエディタ(Vimなど)をお勧めします。このような大きなファイルを扱うときは、すべての形式のシンタックスハイライトやフォールディングをオフにすると便利です。検討する価値

その他のオプション:

  1. EditPadPro - 私は何をこのサイズにそれを試したことがありませんが、それは他のJGSoft製品のようなものだならば、それは風のように動作するはずです。構文のハイライトを無効にすることを忘れないでください。

  2. VEdit - これは1GBのファイルでこれを使用しましたが、まるで何もないように動作します。ここで

  3. EmEditor

+0

提供されたリンクのサンプルでタグチェックが行われていますか? –

+0

CodeProjectリンクについて聞いているなら、私は、各分割ファイルの最初と最後にルートノードを挿入すると思います。 – Cerebrus

+0

残念ながら、750 MB後にクラッシュしました –

-1

Xmlツールではなく、Ultraeditが役立つかもしれませんが、私は2Gファイルで使用しましたが、まったく気にしませんでしたが、自動バックアップ機能をオフにしてください。

+0

私はそれを分割する必要があります –

+0

私はリンクされた項目にソリューションを追加しましたhttp://stackoverflow.com/questions/4325823/how-do-i-split-a-large-xml-file/ –

+0

UEを使用して大きなファイルを分割する方法http://www.ultraedit.com/support/tutorials_power_tips/ultraedit/split-large-files.html – MrTelly

3

CMarkupファイルモードを使用して自由firstobjectのXMLエディタ(フォックス)でそれを行うには、低メモリフットプリントスクリプトです。相互依存しないトップノードやタグのチェックが何を意味するのかよく分かりませんが、ルート要素の下に、オブジェクトプロパティやローを含む何百万ものトップレベル要素があり、それぞれを1つの単位としてまとめておく必要があります。出力ファイルあたり100万は、あなたがこれを行うことができます:

split_xml_15GB() 
{ 
    int nObjectCount = 0, nFileCount = 0; 
    CMarkup xmlInput, xmlOutput; 
    xmlInput.Open("15GB.xml", MDF_READFILE); 
    xmlInput.FindElem(); // root 
    str sRootTag = xmlInput.GetTagName(); 
    xmlInput.IntoElem(); 
    while (xmlInput.FindElem()) 
    { 
    if (nObjectCount == 0) 
    { 
     ++nFileCount; 
     xmlOutput.Open("piece" + nFileCount + ".xml", MDF_WRITEFILE); 
     xmlOutput.AddElem(sRootTag); 
     xmlOutput.IntoElem(); 
    } 
    xmlOutput.AddSubDoc(xmlInput.GetSubDoc()); 
    ++nObjectCount; 
    if (nObjectCount == 1000000) 
    { 
     xmlOutput.Close(); 
     nObjectCount = 0; 
    } 
    } 
    if (nObjectCount) 
    xmlOutput.Close(); 
    xmlInput.Close(); 
    return nFileCount; 
}

を私はここで、この程度ユーチューブ動画や記事を掲載:どのようにして

http://www.firstobject.com/xml-splitter-script-video.htm

0

をあなたはそれを分割する必要がありますか? XmlReader.ReadSubTreeを使用してコードを書くのはかなり簡単です。現在の要素とそのすべての子要素に対して新しいxmlReaderインスタンスを返します。したがって、ルートの最初の子に移動し、ReadSubtreeを呼び出し、それらのノードをすべて書き、元のリーダーを使用してRead()を呼び出し、完了するまでループします。

7

XmlSplit - 大規模なXMLファイル

xml_splitを分割コマンドラインツールは、 - 小さなチャンク

スプリットbhayanakmaut (ノーソースコードと、私はこの1つは作業をすることができませんでした)によって、そのXML

同様の質問:How do I split a large xml file?

+0

エラー#16は、1GBファイルの最大ファイルサイズの制限を超えています。分割できる最大サイズは? –

0

QXMLEditは、専用のを持っています私はWikipediaのダンプでうまく使用しました。 〜2.7Gioファイルは〜40000000個のファイル(1ページに1つ)の束となった。サブフォルダにそれらをディスパッチすることさえできます。

+0

私はあなたがdownvotedされた理由を知らない、これは非常に便利な、オープンソースのツールです。 – jeffmcneill

0

オープンソースライブラリカンマには、非常に大きなXMlファイル内のデータを検索し、それらのファイルを小さなファイルに分割するためのツールがいくつかあります。

https://github.com/acfr/comma/wiki/XML-Utilities

彼らはxmlstarletとサクソンのようなDOMツリーとメモリを埋めないようにツールはexpatのSAXパーサーを使用して構築されました。

+0

これらは私にとってはるかに小さいファイル(〜1GB)で失敗します。 – blueberryfields

+0

xmlstarletとsaxonも私たちのために失敗しました。そのため、xmlツールをカンマに追加しました。 –

0
Used this for splitting Yahoo Q&A dataset 

    count = 0 
    file_count = 1 
    with open('filepath') as f: 

    current_file = "" 

    for line in f: 
     current_file = current_file + line 

     if "</your tag to split>" in line: 
      count = count + 1 

     if count==50000: 
      current_file = current_file + "</endTag>" 
      with open('filepath/Split/file_' +str(file_count)+'.xml' , 'w') as split: 
       split.write(current_file) 
      file_count = file_count + 1 
      current_file = "<?xml version='1.0' encoding='UTF-8'?>\n<endTag>" 
      count = 0 

current_file = current_file + "</endTag>" 
with open('filepath/Split/file_' +str(file_count)+'.xml' , 'w') as split: 
    split.write(current_file) 
関連する問題