Skip to content

Fix read_adi_parallel: chunk_size=0, memory efficiency, and multi-line records#3

Draft
Copilot wants to merge 3 commits intomainfrom
copilot/fix-read-adi-parallel-issues
Draft

Fix read_adi_parallel: chunk_size=0, memory efficiency, and multi-line records#3
Copilot wants to merge 3 commits intomainfrom
copilot/fix-read-adi-parallel-issues

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Feb 14, 2026

read_adi_parallel had critical bugs: chunk_size could become 0 when num_processes exceeded record count, causing range() errors; readlines() loaded entire files into memory; and line-based chunking broke multi-line ADIF records.

Changes

  • Fixed chunk_size=0: Cap num_processes at record count and ensure chunk_size >= 1
  • Streaming file reading: Replace readlines() with line-by-line iteration, accumulating until <EOR> delimiter
  • Multi-line record support: Build complete records before chunking instead of splitting by lines
  • Regex hardening: Changed field name pattern from (.*?) to ([^:]+?) to prevent matching colons (invalid per ADIF spec)
# Before: Would fail with ValueError
parser.read_adi_parallel('file.adi', num_processes=1000)  # More processes than records

# After: Automatically adjusts num_processes
parser.read_adi_parallel('file.adi', num_processes=1000)  # ✓ Works correctly

The method now handles edge cases robustly while maintaining identical output to serial read_adi().

Original prompt

修正内容(概要):
リポジトリ JS2IIU-MH/adiftools-dev のうち、優先度高の問題(1〜2)を修正するPRを作成してください。具体的には以下の2点を修正します。

  1. adiftools/adiftools.py の read_adi_parallel に関する不具合と堅牢化
  • 問題点:

    • chunk_size の計算により、num_processes が adif データの行数より大きい場合に chunk_size が 0 になり range(..., step=0) 相当のエラーや例外を引き起こす可能性がある。
    • ファイルを lines = file.readlines() で丸ごと読み込むため大きなファイルでメモリ不足になる恐れがある。
    • 現在の実装は行単位でチャンク分割しているため、レコードが複数行にまたがる場合にレコードを分割してしまう可能性がある。
    • 正規表現 pattern = re.compile(r'<(.?):(\d+)>([^<])') が最初のキャプチャで貪欲な (.*) を使っており、フィールド名の取り違えや想定外のマッチを起こす可能性がある。
  • 実装指示(変更点):

    • ファイル全体を単純に行で分割したままチャンク化するのではなく、ADIF のレコード区切り()で分割して「レコード単位」でチャンク化するようにする。
      • 具体的には adif_data を ''.join(adif_data) で結合し、re.split('(?i)', text) のように大文字小文字を区別せずで分割して records リストを作る。
    • num_processes を len(records) に合わせて調整する(num_processes = min(num_processes, max(1, len(records))))
    • chunk_size = max(1, len(records) // num_processes) とし、必ず 1 以上になるようにする。
    • チャンクはレコードのリストを要素とする list[list[str]] として作成し、pool.map(self._process_chunk, chunks) で処理する。
    • _process_chunk を行ベースからレコードベースに変えて、引数を chunk_records(list of record strings)として処理するように変更する。
    • 正規表現を安全なパターンに変更する(例: r'<([^:>]+):(\d+)>([^<]*)')とし、フィールド名は field[0].upper().strip()、値は field[2].upper().strip() の既存の動作を保つか、コメントで理由を記載する。
    • 可能であれば処理の説明を docstring に追加する。
  • 期待される効果:

    • num_processes が大きすぎてチャンクサイズが 0 になる問題を解消。
    • レコード単位でチャンク化することで複数行にわたるレコードの分割を防止。
    • 正規表現の堅牢化によりフィールド抽出の信頼性を向上。
  1. module_check.py のトップレベル出力の副作用除去
  • 問題点:
    • module_check.py のトップレベルで print(find_packages(...)) を実行しているため、モジュールを import しただけで標準出力に出力される(副作用)。
  • 実装指示(変更点):
    • トップレベルでの print を削除し、代わりに if name == 'main': ブロックに print を移動する。
    • あるいは main() 関数を作り、実行時のみ出力されるようにする。単純な修正として main ガードの追加で問題解決してください。

PR タイトル(候補):
"Fix read_adi_parallel chunking and make parsing more robust; prevent module import side-effects"

追加情報・注意:

  • 既存のロジックを大幅には変えず後方互換性を保つこと。
  • 既存テストがあれば破壊しないように注意する(テストが failing する場合は修正内容を最小に抑えつつ、その旨をPRの説明に記載)。
  • この PR には変更したファイルと変更理由、簡単な説明(どのような問題をどう直したか)を含むコミットメッセージと PR 説明を付けてください。
  • 変更対象ファイル:
    • adiftools/adiftools.py
    • module_check.py

必要な場合は、追加の修正(ドキュメントや README の軽微な修正)は別PRで行う旨を PR 説明に書いてください。

(コードの差分は私にレビューさせるか、PR を開いた後に自動で私が生成した修正を表示してください)

This pull request was created from Copilot chat.


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Copilot AI and others added 2 commits February 14, 2026 07:44
…egex pattern

Co-authored-by: JS2IIU-MH <146515386+JS2IIU-MH@users.noreply.github.com>
… redundant assertion

Co-authored-by: JS2IIU-MH <146515386+JS2IIU-MH@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix issues in read_adi_parallel function Fix read_adi_parallel: chunk_size=0, memory efficiency, and multi-line records Feb 14, 2026
Copilot AI requested a review from JS2IIU-MH February 14, 2026 07:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants