1. 現象
>w $zv
IRIS for Windows (x86-64) 2024.3 (Build 217U) Thu Nov 14 2024 17:59:58 EST
大きなXMLファイル(約165MB)をライブラリー%XMLでパースすると、<FILEFULL>エラーが発生する。
エラーパート
s libraryFile = "D:\iTunes3\iTunes Library.xml" ;サイズ=165M
w !,"libraryFile = ",libraryFile
w !,"##class(%File).GetFileSize(libraryFile)=",##class(%File).GetFileSize(libraryFile)
w !,"s sc=##class(%XML.TextReader).ParseFile(libraryFile,.reader) 実行"
Set sc = ##class(%XML.TextReader).ParseFile(libraryFile,.reader)
w !,$SYSTEM.Status.GetErrorText(sc)
q
libraryFile = D:\iTunes3\iTunes Library.xml
##class(%File).GetFileSize(libraryFile)=165739267
s sc=##class(%XML.TextReader).ParseFile(libraryFile,.reader) 実行
エラー #6301: SAX XMLパーサエラー: <FILEFULL>startElement+3^%XML.SAX.Utils.Sequencer.1 ^||IRIS.Temp(4,13592576),c:\intersystems\iris1\mgr\iristemp\ while processing D:\iTunes3\iTunes Library.xml at line 2280394 offset 34
USER>
上の処理と同時に同じネームスペースで、##Class(%Stream.TmpCharacter) の処理をしていて、それも
エラー #5002: ObjectScript エラー:<FILEFULL>SetupTmpGbl+3^%Stream.GlobalCharacter.1 ^||%IRIS.Stream,c:\intersystems\iris1\mgr\iristemp\
で止まる。
また、起動していた、システム管理ポータルも次の遷移時に
エラー #5002: ObjectScript エラー:<FILEFULL>GetCSPClassName+18^%SYS.cspServer ^IRIS.TempCSP("ClsN","%SYS","/iris1/csp/sys/exp/%25CSP.UI.Portal.SQL.Home.zen","/iris1/csp/sys/%CSP.Broker.cls"),c:\intersystems\iris1\mgr\iristemp\
で止まる。この時、各処理をHALTしないで、IRISのSTOPをすると、止まらい場合があり、強制終了(iris force IRIS1)が必要な場合があった。
直接の原因は、IRISTEMP(c:\intersystems\iris1\mgr\iristemp\)のIRIS.DATで <FILEFULL>エラー(空きなし)が起こっている。
2. 再現検証テスト
いろいろ調べましたが、問題は、「IRISTEMP のサイズがある値(240M、276M、282M あたり)以上に拡張されない」ことにあるのでないかと思います。
以下、その簡単な検証テストです。
1) IRIS(インスタンス名=IRIS1)を停止
2)C:\InterSystems\IRIS1\mgr\iristemp\IRIS.DAT (現サイズ282.624KB) を削除
3) IRIS1 起動
4) ターミナル %SYS
%SYS>d ^DATABASE (管理ポータル > システムオペーレション > データベース > IRISTEMP の代わり)
1) Create a database
2) Edit a database
3) List databases
4) Delete a database
5) Mount a database
6) Dismount a database
7) Compact globals in a database
8) Show free space for a database
9) Show details for a database
10) Recreate a database
11) Manage database encryption
12) Return unused space for a database
13) Compact free space in a database
14) Defragment a database
15) Show background database tasks
16) Manage multi-volume database properties
Option? 9
Database directories? C:\InterSystems\IRIS1\mgr\iristemp\
Directory: c:\intersystems\iris1\mgr\iristemp\
MirrorDBName:
MaxSize: 0
Size: 1
Status: マウント/RW
BlockSize: 8192
ClusterMountMode: 0
ClusterMounted: 0
ExpansionSize: 0
LastExpansionTime:
Mounted: 1
NewGlobalCollation: IRIS standard
NewGlobalGrowthBlock: 50
NewGlobalIsKeep: 0
GlobalJournalState: いいえ
NewGlobalPointerBlock: 16
ReadOnly: 0
ResourceName: %DB_IRISTEMP
MountedReadOnly: 0
EncryptedDB: 0
EncryptionKeyID:
NewVolumeThreshold: 0
NewVolumeDirectory: c:\intersystems\iris1\mgr\iristemp\
MultiVolume: 0
Configured DB Name: IRISTEMP
Mount Required At Startup: Yes
8) Show free space for a database
Option? 8
Database directory to show free space for (*=All)? C:\InterSystems\IRIS1\mgr\iristemp\
Database Free Space
Sep 01 2025 9:10 AM
Database Max Size Size Available %Free Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限 1MB 0.17MB 17 70.25GB
IRIS.DATのエクスプローラサイズ 初期値 1M
5) ターミナル USER
テンポラリーグローバル ^||...に大量書き込み
USER>s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
i=273
同様 IRISTEMPで <FILEFULL> エラー
i=300 まで行かない。IRISTEMPのサイズ拡張が止まり、空き領域なしでエラー?
6) ターミナル %SYS>d ^DATABASE
Database Free Space
Sep 01 2025 9:16 AM
Database Max Size Size Available %Free Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限 276MB 0.62MB 0 <- 69.98GB
%Free=0
エクスプローラ IRIS.DAT サイズ 282.624KB
7) ターミナル USER HALT
空き領域は回復
8) ターミナル %SYS>d ^DATABASE
Database Free Space
Sep 01 2025 9:18 AM
Database Max Size Size Available %Free Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限 276MB 275MB 100 69.98GB
9) %SYS で 実行
%SYS>s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
i=273
同様にエラー。%SYSでも、テンプグローバル ^||... は、IRISTEMを使っている。
Database Free Space
Sep 01 2025 9:21 AM
Database Max Size Size Available %Free Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限 276MB 0.57MB 0 <- 69.98GB
%SYS>k ^||temp
%SYS>d ^DATABASE
Database Free Space
Sep 01 2025 9:22 AM
Database Max Size Size Available %Free Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限 276MB 275MB 100 69.98GB
エクスプローラ IRIS.DAT サイズ 282.624KB 変わらず。
%SYSも含め、すべてのネームスペースのTemp Storageは、同じ IRISTEMP にマップされている。
3. その他テスト
3.1 管理ポータル/ローカルデータベースでサイズ拡大処理
管理ポータル > システム管理 > 構成 > システム構成 > ローカルデータベース
名前 IRISTEMP
ディレクトリ c:\intersystems\iris1\mgr\iristemp\
ブロックサイズ 8192 バイト
サイズ (MB) 現在 240 (>=240)
拡張 0 デフォルトは0
最大 0 0で無制限になります
リソース名 %DB_IRISTEMP
で、現在の値を、500等、より大きな値を入れるが、270 -> 276 になるが、これ以上大きくならない。拡張に10,100等を指定するが効果なし。
ちなみに、IRIS.DATサイズの初期値が 1M の時は、現値に、500 入れると、一覧表示のステータスが 拡大中となる。しかし、276M で拡張が止まる。
3.2 新データベース MYTEMP を作成、Temp Storage にマップするが、マップされていない
通常のIRIS.DATの様に拡張可能性を期待してMYTEMPという別のデータベースを新規に作り、管理ポータル > ネームスペースで
既存別ネームスペース(USER2) のTemp Storageを IRISTEMP から MYTEMP に設定、テストしました。
管理ポータル > システム管理 > 構成 > システム構成 > ネームスペース
Namespace Globals Routines Temp Storage
%SYS IRISSYS IRISSYS IRISTEMP グローバルマッピング ルーチンマッピング パッケージマッピング - (変更削除不可)
USER USER USER IRISTEMP グローバルマッピング ルーチンマッピング パッケージマッピング 削除
USER2 USER2 USER2 MYTEMP グローバルマッピング ルーチンマッピング パッケージマッピング 削除
%SYS>d ^DATABASE
Database Free Space
Sep 01 2025 9:30 AM
Database Max Size Size Available %Free Disk Free
d:\intersystems\iris1\mytemp\ 無制限 240MB 239MB 100 155.09GB
エクスプローラ IRIS.DAT サイズ 282.624KB
(管理ポータル > ローカルデータベースで 現在の値を、500に入れても、240Mのまま、無駄な?拡張は避けている模様?)
USER2 >s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
i=273
エラーから、Temp Strage が D:\InterSystems\IRIS1\MYTEMP\ でなく c:\intersystems\iris1\mgr\iristemp\
Temp Storageが指定通りにマップされていない模様?
3.3 IRIS修理再インストール
c:\intersystems\iris1\mgr\iristemp\IRIS.DAT を削除後
IRIS_Community-2024.3.0.217.0-win_x64.exe
を修理再インストールするが、システム変更されていませんとなり、¥iristemp¥ には、何も作られない状態でした。
起動後
message.logに
09/01/25-13:55:51:991 (6084) 0 [Utility.Event] Creating missing IRISTEMP database in C:\InterSystems\IRIS1\mgr\iristemp
09/01/25-13:55:52:017 (6084) 0 [Database.MountedRW] Mounted database c:\intersystems\iris1\mgr\iristemp\ (SFN 3) read-write.
09/01/25-13:55:52:021 (6084) 0 [Utility.Event] C:\InterSystems\IRIS1\mgr\iristemp\ initialized as IRISTEMP
のログあり
管理ポータル > システムオペーレション > データベース > IRISTEMP
ディレクトリ: c:\intersystems\iris1\mgr\iristemp\
リソース名: %DB_IRISTEMP
マウント: はい
読込専用: いいえ
読み取り専用の理由:
暗号化: いいえ
暗号化キーID:
データベースサイズ
ブロックサイズ: 8192
ブロック: 1408
最大サイズ: 無制限
サイズ: 11MB
拡張サイズ: システムデフォルト
利用可能空き容量: 9.9MB
% 空き容量: 90%
ディスク空き容量: 69.63GB
最終拡張時刻: 09/01/2025 13:56:24
フル: いいえ
新しいボリュームしきい値サイズ(MB): 0
でした。
%SYS>d ^DATABASE
Database Free Space
Sep 01 2025 1:57 PM
Database Max Size Size Available %Free Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限 11MB 9.9MB 90 69.63GB
USER>s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
i=273
4. 問題
問題1:IRISTEMP のサイズが拡張されない
管理画面や ^DATABASE で「無制限」と表示されていても、IRISTEMP の実際の物理ファイル(IRIS.DAT)は 276MB までで拡張が止まる。
拡張サイズ設定(10MB、100MB)を変更しても意味がなかった。0 指定は、あるデフォルトの拡張サイズがある?
このため、大容量処理(例:165MB の XML パース)で TEMP が不足し <FILEFULL> が発生する。
問題2:Temp Storage に MYTEMP を設定しても無視される
管理画面で名前空間の Temp Storage を MYTEMP に設定しても、実際には IRISTEMP にマップされている。
IRISTEMPは、%SYS他のすべてのネームスペースで、Temp Storageとし共有されているため、特別な保護処置や制約等があるのでは?
確認してほしい事
a) IRISTEMP が物理的に 276MB 以上拡張されない理由
(設定は無制限、拡張サイズも十分、ディスク空きもあるにもかかわらず)
b) Temp Storage に別データベース(MYTEMP)を指定しても、IRISTEMP が使用される理由
c) TEMP 領域が大量に必要となる処理(例:XML パース)への対応策
d) IRISTEMP の安全な拡張手順または再作成方法
よろしくお願いします。