Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

データフロー

このページでは、wicket における入力から出力までのデータの流れを説明します。

処理パイプライン

入力 (.xml / .xml.bz2)
  |
  v
DumpReader (ストリーミング XML パース + 名前空間フィルタ)
  |  Article { id, title, namespace, text } を生成
  v
バッチ (1000 記事)
  |
  v
rayon par_iter (並列処理)
  |  clean_wikitext(text) -> プレーンテキスト
  |  format_page(id, title, url_base, text, format) -> フォーマット済み文字列
  v
OutputSplitter (逐次書き込み、ファイルローテーション)
  |
  v
出力ファイル (AA/wiki_00, AA/wiki_01, ...)

各ステージの詳細

1. XML ダンプ読み込み

DumpReaderquick-xml を使用して MediaWiki XML ダンプをストリームとしてパースします。.xml.bz2 ファイルの場合、ストリームは MultiBzDecoder で自動的にラップされ、透過的に展開されます。

リーダーが抽出する情報:

  • ページ ID(<page> 内の <id><revision> 内のものではない)
  • タイトル(<title>
  • 名前空間(<ns>
  • Wikitext 本文(<text>
  • URL ベース(起動時に <siteinfo><base> から1回だけ抽出)

フィルタリスト外の名前空間を持つページはイテレータレベルでスキップされます。

2. バッチ収集

DumpReader イテレータから記事を1000件ずつバッチで収集します。このバッチサイズは、並列化のオーバーヘッドとメモリ使用量のバランスを取っています。

3. 並列処理

各バッチは rayon::par_iter() で処理され、CPU コアに作業を分散します:

  1. clean_wikitext(text) – Wikitext マークアップをプレーンテキストに変換。最も CPU 負荷が高いステップ。
  2. format_page(id, title, url, text, format) – クリーンなテキストを doc または JSON フォーマットに整形。

結果は順序を保持して収集されます(rayon の par_iter は要素の順序を維持)。

4. 逐次出力

フォーマット済みの文字列は OutputSplitter に逐次書き込まれます:

  • 必要に応じてサブディレクトリ(AA、AB、…、ZZ)を作成
  • 設定されたサイズ上限に達したら新しいファイルにローテーション
  • 有効時は bzip2 圧縮を適用
  • パスが "-" の場合は stdout に出力

並列化戦略

wicket はチャネルを使ったパイプラインではなく、バッチベースの並列化アプローチを採用しています:

  1. メインスレッドが DumpReader から1000記事ずつバッチで読み込み
  2. 各バッチを rayon::par_iter() で並列処理
  3. 決定的な出力順序を維持するため、結果を逐次書き込み
  4. 全記事の処理が完了するまで繰り返し

このアプローチはシンプルで、出力順序を維持し、CPU バウンドなクリーニング処理を効果的に並列化しつつ、I/O バウンドな読み込みと書き込みは逐次実行します。