データフロー
このページでは、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 ダンプ読み込み
DumpReader は quick-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 コアに作業を分散します:
clean_wikitext(text)– Wikitext マークアップをプレーンテキストに変換。最も CPU 負荷が高いステップ。format_page(id, title, url, text, format)– クリーンなテキストを doc または JSON フォーマットに整形。
結果は順序を保持して収集されます(rayon の par_iter は要素の順序を維持)。
4. 逐次出力
フォーマット済みの文字列は OutputSplitter に逐次書き込まれます:
- 必要に応じてサブディレクトリ(AA、AB、…、ZZ)を作成
- 設定されたサイズ上限に達したら新しいファイルにローテーション
- 有効時は bzip2 圧縮を適用
- パスが
"-"の場合は stdout に出力
並列化戦略
wicket はチャネルを使ったパイプラインではなく、バッチベースの並列化アプローチを採用しています:
- メインスレッドが
DumpReaderから1000記事ずつバッチで読み込み - 各バッチを
rayon::par_iter()で並列処理 - 決定的な出力順序を維持するため、結果を逐次書き込み
- 全記事の処理が完了するまで繰り返し
このアプローチはシンプルで、出力順序を維持し、CPU バウンドなクリーニング処理を効果的に並列化しつつ、I/O バウンドな読み込みと書き込みは逐次実行します。