4

stackoverflow ダンプ ファイル (Posts.xml-17gb) を解析しようとしています。形式は次のとおりです。

<posts>
<row Id="15228715" PostTypeId="1" />
.
<row Id="15228716" PostTypeId="2" ParentId="1600647" LastActivityDate="2013-03-05T16:13:24.897"/>
</posts>

各質問とその回答を「グループ化」する必要があります。基本的に質問(posttypeid = 1)を見つけ、別の行のparentIdを使用してその回答を見つけ、 db に保存します。

querypath (DOM) を使用してこれを実行しようとしましたが、 exiting(139) のままでした。私の推測では、ファイルのサイズが大きいため、大量のスワップを行ったとしても、私の PC はそれを処理できませんでした。

私はxmlreaderを検討しましたが、xmlreaderを使用して見ると、プログラムはファイルを何度も読み込んでいる(質問を見つけ、答えを探し、何度も繰り返す)ため、実行できません。私が間違っている ?

他の方法/方法はありますか?

ヘルプ!

これは 1 回の解析です。

4

3 に答える 3

5

私はxmlreaderを検討しましたが、xmlreaderを使用して見ると、プログラムはファイルを何度も読み込んでいる(質問を見つけ、答えを探し、何度も繰り返す)ため、実行できません。私が間違っている ?

はい、あなたは間違っています。XMLReader を使用すると、ファイルをトラバースする頻度を独自に指定できます (通常は1 回実行します)。<row>あなたの場合、各要素にこの 1:1 を挿入することさえできない理由はわかりません。属性ごとに、どのデータベース (テーブル?) に挿入するかを決定できます。

私は通常、XMLReader でのトラバースを容易にするイテレータのセットを提案します。これはXMLReaderIteratorと呼ばれ、コードの読み書きがより簡単になるように、次のことを可能にforeachします。XMLReader

$reader = new XMLReader();
$reader->open($xmlFile);

/* @var $users XMLReaderNode[] - iterate over all <post><row> elements */
$posts = new XMLElementIterator($reader, 'row');
foreach ($posts as $post)
{
    $isAnswerInsteadOfQuestion = (bool)$post->getAttribute('ParentId')

    $importer = $isAnswerInsteadOfQuestion 
                ? $importerAnswers 
                : $importerQuestions;

    $importer->importRowNode($post);
}

順序が気になる場合 (たとえば、回答があるのに親の回答が利用できないのではないかと心配するかもしれません)、私はトラバーサル内ではなく、インポーター レイヤー内で注意を払います。

それが頻繁に発生するか、非常に頻繁に発生するか、まったく発生しないか、まったく発生しないかによって、別の戦略を使用します。たとえば、外部キー制約がアクティブになっているデータベーステーブルに直接挿入することは決してありません。場合によっては、重要制約が解除され、最後に再アクティブ化されるインポート全体の挿入トランザクションを作成します。

于 2013-06-03T09:15:41.797 に答える
2

この大きなファイルを処理する方法はシーケンシャルではなく、直接アクセスする必要があるため、実行可能な唯一のオプションはデータを XML データベースにロードすることだと思います。

于 2013-06-02T13:22:21.127 に答える
1

PHP xmlreader を使用するのが正しいようです。

理由: あなたの発言のため:

各質問とその回答を「グループ化」する必要があります。基本的に、質問 (posttypeid=1) を見つけ、別の行のparentId を使用してその回答を見つけ、db に保存します。

私が理解しているのは、質問と回答を含むデータベースを構築するのが好きだということです。したがって、XML レベルで「グループ化」を行う理由はありません。すべての関連情報をデータベースに入れ、DB レベルでグループ化を行います - db コマンド (sql ...) を使用します。

必要なのは、「ターゲット パーサー メソッドを使用する」のようなものを使用することです。例: [Python でxmlを使用して高パフォーマンスの XML 解析を行う(Python 用であっても、良いスタートです)。これは XMLReader で可能です。

于 2013-06-02T11:30:39.800 に答える