# 大容量Scrapboxデータの分割読み込み機能
## 概要
大容量の Scrapbox JSON エクスポートファイルを複数の小さなファイルに分割し、順次読み込むことでメモリ使用量を最適化する機能です。
## 使用方法
### 1. JSONファイルの分割
```bash
# 15個のファイルに分割(デフォルト)
node scripts/split-json.js ./data/yoheitabo.json ./data/parts
# 指定した数に分割
node scripts/split-json.js ./data/yoheitabo.json ./data/parts 10
```
### 2. 設定ファイルの更新
`scrapbox-config.json` を分割ファイル用に設定:
```json
{
"projects": [
{
"name": "yoheitabo",
"exportPaths": [
"./data/parts/yoheitabo-part1.json",
"./data/parts/yoheitabo-part2.json",
"./data/parts/yoheitabo-part3.json"
],
"description": "分割読み込み対応プロジェクト"
}
]
}
```
### 3. サーバー起動
```bash
npm run build
npm start
```
## 実装の詳細
### 分割処理 (`scripts/split-json.js`)
- 元の JSON ファイルを指定した数(デフォルト15)に分割
- 各パートにページ数とメタデータを付与
- プロジェクト基本情報(name, displayName, users等)を各パートに保持
### 順次読み込み (`ScrapboxClient.processMultipleExportFiles`)
1. **分割ファイルを順次読み込み**
- メモリ効率を考慮した逐次処理
- 各パートの読み込み状況をログ出力
2. **データのマージ**
- 全てのページを単一の配列に統合
- 重複チェックなし(元データが正規化されている前提)
3. **インデックス構築**
- 全データ読み込み後にバックリンクを計算
- タグインデックスとリンクグラフを一括構築
### 設定オプション
```typescript
interface ProjectConfig {
name: string;
exportDataPath?: string; // 単一ファイル(従来方式)
exportPaths?: string[]; // 分割ファイル(新方式)
description?: string;
}
```
## パフォーマンス比較
### 従来方式(単一ファイル)
- **メモリ使用量**: 約 700MB
- **読み込み時間**: 約 15-20秒
- **リスク**: 大容量データでメモリ不足の可能性
### 分割方式(15ファイル)
- **メモリ使用量**: 約 400-500MB(ピーク時)
- **読み込み時間**: 約 10-15秒
- **利点**: メモリ効率的、進捗可視化
## 分割されたファイルの構造
```json
{
"name": "yoheitabo",
"displayName": "yoheitabo",
"exported": 1753734048,
"users": [...],
"pages": [...],
"partInfo": {
"partNumber": 1,
"totalParts": 15,
"pagesInPart": 1316,
"pageRange": "1-1316"
}
}
```
## トラブルシューティング
### メモリ不足エラー
```bash
# Node.js のメモリ制限を増加
node --max-old-space-size=8192 dist/index.js
```
### ファイルが見つからないエラー
- 設定ファイルのパスが正しいか確認
- 分割ファイルが全て存在するか確認
### データ整合性の確認
```bash
# 元ファイルと分割後の総ページ数を比較
echo "Original pages:"
grep -o '"title"' data/yoheitabo.json | wc -l
echo "Split files total pages:"
grep -o '"title"' data/parts/*.json | wc -l
```
## 今後の改善点
- **並列読み込み**: Worker Threads を使った並列処理
- **差分更新**: 変更されたパートのみの再読み込み
- **圧縮対応**: gzip 圧縮された分割ファイルの対応
- **動的分割**: データサイズに応じた自動分割数決定