クリアフィルター
記事
Megumi Kakechi · 2020年11月13日
これは InterSystems FAQ サイトの記事です。
管理ポータルから行う手動のパージ(Purge)と、タスクを利用する方法があります。
データを手動でパージするには、[Interoperability] > [管理] > [管理データの削除] ページを使用します。(このページではバックグラウンド・ジョブとしてパージを実行しますので、ページがタイムアウトしても問題ありません。)
タスクでパージする場合は、[システムオペレーション] > [タスクマネージャ] > [新しいタスク] の画面でInteroperabilityプロダクションのネームスペースを指定し、タスクタイプに「Ens.Util.Tasks.Purge」を指定します。
タスクの場合は、「TypesToPurge」の項目で以下のパージ対象タイプを選択できます(図参照)。
イベント・ログ (Events)
メッセージ (Messages)
ビジネス・プロセス・ログ (Business Processes)
ビジネス・ルール・ログ (Rule Logs)
I/O アーカイブ・ログ (I/O Logs)
モニター・カウンター (Host Monitor Data)
管理対象アラート (Managed Alerts)
詳細は、以下のドキュメントをご参照ください。
プロダクション・データのパージ【IRIS】
※注意
2022.1以降のバージョンでは、プロダクションの管理データを削除するためには、新しい特権 "%Ens_PurgeSchedule:USE" リソースが必要となりました。このリソースは "%EnsRole_Administrator" ロールで付与されます。また、カスタムロールに追加することも可能です。 詳細は、こちらのドキュメント をご覧ください。
【ご参考】Ensembleでの孤立メッセージ
記事
Hiroshi Sato · 2022年8月28日
これは InterSystems FAQ サイトの記事です。
実行ログデータなどトランザクション中にロールバックが発生しても前の状態に戻ってほしくないデータがあります。
それらのデータをロールバックされないデータベースIRISTEMPに配置することで上記の要件に対応できます。
一時グローバルと IRISTEMP データベース
ロールバックさせたくないテーブルの実体をこのデータベースにマッピングすることでロールバック後に情報を残すことができます。
ただし、このデータベースはIRIS再起動で内容がクリアされますので、永続的に保持したい場合には、いずれかのタイミング(ロールバック後等)で永続テーブルにコピーを行う必要があります。
また、これとは別に、トランザクション対象外としたいテーブル操作の前にプロセスのジャーナル記録を停止し、操作完了後にジャーナル記録を再開することで、その操作をトランザクション対象外にすることもできます。
ただしこの方法は、ミラーリングをお使いいただく際にはご使用いただけません。
%NOJRN を使用したプロセス・レベルでのジャーナリングの管理
デベロッパーコミュニティの記事
記事
Mihoko Iijima · 2021年6月4日
これは InterSystems FAQ サイトの記事です。
ユーザーが作成したクラス定義は、クラス定義クラスの中に格納されます。
クラス定義一覧をプログラムから取得する方法として、「クラス定義クラス」を利用することができます。
メモ:クラス定義クラスとは、%Dictionary パッケージに含まれるクラス全般のことをさします。
以下サンプルコードでは、%Dictionary.ClassDefinitionQuery クラスの Summary クエリを利用してクラス定義一覧を取得しています。
Class ISJ.Utils
{
ClassMethod ClassInfo()
{
#dim ex As %Exception.AbstractException
try {
set currentNS=$NAMESPACE
while (1) {
read "ネームスペースを指定してください : ",x
if x'="" quit
}
set $NAMESPACE=x // ネームスペースの移動
write !! // 見やすくするために2回改行
Set statement = ##class(%SQL.Statement).%New()
Do statement.%PrepareClassQuery("%Dictionary.ClassDefinitionQuery","Summary")
set rs = statement.%Execute()
while rs.%Next() {
set name=rs.%Get("Name")
if name["%" continue // %つきのクラスは飛ばす
if $extract(name,1,3)="csp" continue // csp.*は飛ばす
if $extract(name,1,3)="csr" continue // csr.*は飛ばす
write name,!
}
set $NAMESPACE=currentNS
}
catch ex {
write "エラー発生 : ",ex.DisplayString(),!
set $NAMESPACE=$get(currentNS)
}
}
}
実行例は以下の通りです。
クラスメソッドを実行すると、「ネームスペースを指定してください」と出るので、参照したいネームスペース名を指定してください。
USER>do ##class(ISJ.Utils).ClassInfo()
ネームスペースを指定してください : USER
CSPX.Dashboard.BarChart
CSPX.Dashboard.Chart
CSPX.Dashboard.ChartSeries
CSPX.Dashboard.FuelGauge
<省略>
INFORMATION.SCHEMA.VIEWTABLEUSAGE
ISJ.Utils
Test.JSONTest
Test.Person
Test.REST
Test.VSCode.REST
USER>
関連記事:ルーチン一覧をプログラミングで取得する方法
記事
Toshihiko Minamoto · 2021年9月20日
開発者の皆さん、こんにちは!
CSVまたはURLからCSVデータをプログラムでInterSystems IRISにインポートしなければならない場合があります。 そして、適切なデータ型でクラスが作成され、そのデータがインポートされることを期待するでしょう。
それを実現する[csvgen](https://openexchange.intersystems.com/package/csvgen)モジュールをOpen Exchangeに公開しました。
IRISにCSVファイルをインポートするだけであれば、次のようにすることができます。
USER>do ##class(community.csvgen).Generate("/usr/data/titanic.csv",,"Data.Titanic")
Class name: Data.Titanic
Header: PassengerId INTEGER,Survived INTEGER,Pclass INTEGER,Name VARCHAR(250),Sex VARCHAR(250),Age INTEGER,SibSp INTEGER,Parch INTEGER,Ticket VARCHAR(250),Fare MONEY,Cabin VARCHAR(250),Embarked VARCHAR(250)
Records imported: 891
USER>
または、[GitHubのCOVID-19 Data](https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_daily_reports/05-29-2020.csv)のように、インターネット上にCSVがある場合は、次のようにしてデータを取得できます。
USER>d ##class(community.csvgen).GenerateFromURL("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/05-29-2020.csv",",","Data.Covid19")
Class name: Data.Covid19
Header: FIPS INTEGER,Admin2 VARCHAR(250),Province_State VARCHAR(250),Country_Region VARCHAR(250),Last_Update DATE,Lat MONEY,Long_ DOUBLE,Confirmed INTEGER,Deaths INTEGER,Recovered INTEGER,Active INTEGER,Combined_Key VARCHAR(250),Incidence_Rate DOUBLE,Case-Fatality_Ratio DOUBLE
Records imported: 3522
USER>
##
## インストール
パッケージはZPMを使ってインストールできます。
USER>zpm
zpm:USER>install csvgen
csvgenモジュールは単なる [CSV2CLASSメソッド](https://cedocs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?APP=1&CLASSNAME=%25SQL.Util.Procedures)のラッパーです。
ObjectScriptの品質プロファイルについて。
あまり理想的な品質ではないため、ご協力、大歓迎です!
お知らせ
Rie Tokue · 2023年3月29日
開発者の皆さん、こんにちは。インターシステムズジャパン、マーケティング担当・徳江です。
弊社は4月26日(水)13時30分~14時「Pythonでデータベースプログラミング」と題し、
オンラインセミナーを開催いたします。
【概要】
本セミナーでは、InterSystems IRIS Data Platformの機能であるEmbedded Pythonをご紹介し、IRISのデータベースを扱う
Pythonプログラムの基本的な書き方をご説明します。デモもお見せする予定です。
Embedded Pythonは、IRISのサーバサイドのロジックをPythonで記述するための仕組みです。Embedded Pythonによって、
・ IRISの開発者が、Pythonの豊富なライブラリを簡単に活用することが可能になります。
・ Pythonプログラマが、IRISの高性能なデータベースを利用するプログラムを容易に開発することができます。
【アジェンダ】
プログラミング言語Pythonの特長
Embedded Pythonの概要
PythonのプログラムからIRISのデータベースを使う方法
IRISのObjectScriptからPythonのプログラムを活用する方法
【対象者】
IRISに関わる技術者の方
データベースプログラムを開発するPythonプログラマの方
Pythonに興味がある方
【以下の方にお勧め】
データ分析などでPythonを活用したいとお考えの方
ObjectScriptを学ばずにIRISを活用したい方
ご登録はこちらからお願いいたします(参加費無料)。
皆様のご参加をお待ちしております!
記事
Tomoko Furuzono · 2025年3月27日
これは、InterSystems FAQ サイトの記事です。
システムログ(messages.log/cconsole.log)に出力される、
[Utility.Event] %SYS.Task.FeatureTracker failed to transfer data
というログは、機能トラッカというタスクが出力しているメッセージです。このタスクは、弊社がユーザ使用状況の統計を取得する為のデータ送信タスクになります。エラーは弊社と通信が行われてない為に発生しています。
機能トラッカの詳細については下記ドキュメントをご確認ください。機能トラッカによる使用量統計の収集
このタスク自体は、アプリケーションやシステムの動作自体に関連はありませんので、メッセージが出ていても影響はありませんが、タスクを無効にすることもできます。機能トラッカのタスクを無効にする手順は以下の通りです。
1. 管理ポータルで、[システム操作]→[タスクマネージャ]→[タスクスケジュール] を選択2. 機能トラッカの行を見つけて、[機能トラッカ] を選択3. タスク詳細のページが表示されたら、[一時停止]4. [タスク実行が一時停止された場合にタスクを再スケジュールしますか?] という質問に適切に回答 → いいえ5. [このアクションをすぐに実行する] を選択、タスクを停止
記事
Megumi Kakechi · 2024年6月11日
SSL/TLS を使用するように InterSystems IRIS スーパーサーバを構成した際に、「管理ポータルに接続できなくなった」というお問い合わせを時々いただきます。こちらの記事では、その際の対処法をご案内します。
スーパーサーバを SSL/TLS 化するために、以下のドキュメントにある方法を設定されると思います。TLS を使用するための InterSystems IRIS スーパーサーバの構成
その際に、SSL/TLSサポートレベル を 「必須」にしてしまうと、管理ポータルに接続できなくなる場合があります。
※管理ポータル: IRIS2024.1 ~ [システム管理] > [セキュリティ] > [スーパーサーバ] ~IRIS2023.1 [システム管理] > [セキュリティ] > [システム・セキュリティ] > [システムワイドセキュリティパラメータ]
「必須」に設定する場合、すべてのクライアントからの接続を SSL/TLS 化する必要があります。これは、WebゲートウェイからIRISへの接続にもあてはまるため、「Webゲートウェイ <==> IRIS」間を SSL/TLS 設定していない場合は、管理ポータル(REST/CSPを含む)に接続ができなくなってしまいます。
「有効」に設定する場合は、 SSL/TLS を使用するクライアント接続を受け入れますが、それは必須ではありません。つまり、 SSL/TLS を使用するクライアントからの通信は暗号化されますが、そうではないクライアントからの通信は暗号化されません。
管理ポータルに接続できない状態になってしまった場合、以下のような「サーバアベイラビリティエラー(Server Availability Error)」となります。
この場合、以下の2つの回避策があります。
1. WebゲートウェイからIRISサーバへの接続を SSL/TLS 設定にする方法
2. IRISサーバのSSL/TLSサポートレベルを「有効」に設定する方法
1.WebゲートウェイからIRISサーバへの接続を SSL/TLS 設定にする方法
こちらの場合、Webゲートウェイ管理ページで設定を行います。
http://localhost/iris/csp/bin/Systems/Module.cxw
① [サーバ接続] メニューより、接続するサーバを選択します。
② 以下の設定をして保存します。 接続セキュリティレベル:SSL SSL CA 証明書ファイル:(CA証明書パス) ※その他、必要に応じて
③ サーバ接続のテストを行います。テストに成功すれば、管理ポータルには接続できる状態となっています。
↓ 接続成功の場合
2.IRISサーバのSSL/TLSサポートレベルを「有効」に設定する方法
こちらの場合、管理ポータルには接続できないため、ターミナルで ^SECURITY ユーティリティを使用して設定を行います。バージョンによって、設定箇所が違うため、それぞれのバージョンでご説明します。
※2024.1以降のバージョン
USER>zn "%SYS"
%SYS>do ^SECURITY
1) User setup
2) Role setup
3) Service setup
4) Resource setup
5) Application setup
6) Auditing setup
8) SSL configuration setup
9) Mobile phone service provider setup
10) OpenAM Identity Services setup
11) Encryption key setup
12) System parameter setup
13) X509 User setup
14) KMIP server setup
15) Superserver setup
16) Exit
Option? 15 <-- 15 + <Enter>
1) Create superserver
2) Edit superserver
3) List superservers
4) Detailed list superservers
5) Delete superserver
6) Export superservers
7) Import superservers
8) Exit
Option? 2 <-- 2 + <Enter>
Superserver port to edit? ?
Num Port BindAddressDisplay
1) 1972
Superserver port to edit? 1 1972 Bind Address <-- 設定したいスーパーサーバポート(既定は1972); 1 + <Enter>
Description? System default port => <-- <Enter>
Enable Clients? Yes => Yes <-- <Enter>
Enable CSP? Yes => Yes <-- <Enter>
Enable DataCheck? Yes => Yes <-- <Enter>
Enable Shadows? No => No <-- <Enter>
Enable ECP? Yes => Yes <-- <Enter>
Enable Mirror? Yes => Yes <-- <Enter>
Enable Sharding? Yes => Yes <-- <Enter>
Enable SNMP? Yes => Yes <-- <Enter>
Enable NodeJS? No => No <-- <Enter>
Enable CacheDirect ? No => No <-- <Enter>
Enable WebLink? No => No <-- <Enter>
SSL/TLS support level
---------------------
1) None
2) Accept
3) Require
What type of SSL/TLS connections are allowed for the server? 3 => 2 <-- 3(必須) を 2(有効) に変更 + <Enter>
SSL/TLS configuration? %SuperServer => <-- <Enter>
Enable this superserver? Yes => Yes <-- <Enter>
Confirm changes to Port 1972? Yes => Yes <-- <Enter>
Superserver 1972 updated <-- <Enter>
Superserver port to edit? <-- 以下全て <Enter>
:
※2023.1以前のバージョン
USER>zn "%SYS"
%SYS>do ^SECURITY
1) User setup
2) Role setup
3) Service setup
4) Resource setup
5) Application setup
6) Auditing setup
8) SSL configuration setup
9) Mobile phone service provider setup
10) OpenAM Identity Services setup
11) Encryption key setup
12) System parameter setup
13) X509 User setup
14) KMIP server setup
15) Exit
Option? 12 <-- 12 + <Enter>
1) Edit system options
2) Edit authentication options
3) Edit LDAP options
4) Display system options
5) Export All Security settings
6) Import All Security settings
7) Exit
Option? 1 <-- 1 + <Enter>
Enable configuration security? No => No <-- <Enter>
Default security domain? iscinternal.com => <-- <Enter>
Inactive limit? 0 => <-- <Enter>
Invalid login limit (0=No limit)? 5 => <-- <Enter>
Disable user account when login limit reached? No => No <-- <Enter>
How many days until passwords expire (0=No expiration)? 0 => <-- <Enter>
Password pattern? 3.128ANP => <-- <Enter>
Password Validation Routine (label^routine format)? <-- <Enter>
Enable writing to % globals? No => No <-- <Enter>
Role required to connect to this system? <-- <Enter>
Allow multiple security domains? No => No <-- <Enter>
SSLServer connect type
----------------------
1) None
2) Accept
3) Require
What type of SSL/TLS connections are allowed for the super server? 3 => 2 <-- 3(必須) を 2(有効) に変更 + <Enter>
SSL Telnet Server connect type
----------------------
1) None
2) Accept
3) Require
What type of SSL/TLS connections are allowed for the telnet server? 1 => <-- 以下、全て <Enter>
:
こちらで無事、管理ポータルへの接続ができるようになるでしょう。
「TLS を使用するための InterSystems IRIS スーパーサーバの構成」を行う場合は、十分にご注意ください。
記事
Toshihiko Minamoto · 2022年12月31日
YASPEはYAPE(Yet Another pButtons Extractor)の後継機種です。YASPEは、メンテナンスと拡張を容易にするために、多くの内部変更を行い、一から書き直しました。
YASPEの機能は以下の通りです。
- 「InterSystems Caché pButtons」 および 「InterSystems IRIS SystemPerformance」 ファイルを解析してグラフ化し、オペレーティング・システムおよび IRIS のメトリックを迅速にパフォーマンス解析します。
- アドホックチャートを作成したり、「Pretty Performance」オプションでOperating SystemとIRISの指標を組み合わせたチャートを作成することで、より深く掘り下げることが可能です。
- 「System Overview」 オプションを使用すると、システムの詳細や一般的な設定オプションについて SystemPerformance ファイルを検索する手間を省くことができます。
YASPEはPythonで書かれています。ソースコードはGitHubで公開されており、Dockerコンテナ用には以下で公開されています。
> - https://github.com/murrayo/yaspe
---
> YASPEは、現在のOperating SystemとIRISのバージョンに重点を置いています。古いバージョンを実行してYASPEに問題がある場合、YAPEを介してパフォーマンスファイルを正常に実行するかどうかを確認することができます。問題がある場合は、遠慮なくGitHubを通じて私に連絡してください。
---
## 例
### 出力ファイル
オプションは以下の通りです:
- mgstat と vmstat または windows perfmon の全カラムの HTML または PNG チャートと、フォルダへの出力。
- iostatのチャート作成は、大きなディスクリストがある場合、時間がかかることがあるため、オプションとします。
- Excelなどでさらに手作業で加工するためのCSVファイルなどです。

### Pretty Performance
以下はカスタムチャートの例で、Glorefs (mgstat) とTotal CPUの使用率 (vmstat)です。
[](https://github.com/murrayo/yaspe/blob/main/images/Glorefs_and_CPU_Utilisation_-_Sample_site_name_Monday_17_Jan_2022.png)
下の画像は、指定した時間へのズームを含むデフォルト画像の1つです(デフォルトは13:00-14:00)。
[](https://github.com/murrayo/yaspe/blob/main/images/CPU_Utilisation_1000_1100.png)
### システム概要
_yaspe_ は、システムの概要と基本的な設定のチェックを含みます (`-s`)
このチェックは、システムの詳細を探すために SystemPerformance ファイルを探し回る手間を省くためのものです。以下は `overview.txt` の例です。
```text
サイト名称のSystem Summary
ホストネーム : YOURHOST
インスタンス : SHADOW
オペレーティングシステム : Linux
プラットフォーム : N/A
CPUの数 : 24
プロセッサー : Intel(R) Xeon(R) Gold 6248 CPU @ 2.50GHz
メモリ : 126 GB
共有メモリ : globals 71680 MB + routines 1023 MB + gmheap 1000 MB = 73,703 MB
バージョン : Cache for UNIX (Red Hat Enterprise Linux for x86-64) 2018.1.4 (Build 505_1U) Thu May 28 2020 10:11:16 EDT
収集日 : プロファイル実行「24hours」は、2021年11月22日16時15分00秒に開始されました。
注意:
- エラー発生時のジャーナルフリーズは使用できません。ジャーナルIOエラーが発生した場合、この期間に発生したデータベースアクティビティは復元できません。
- swappinessのパラメータは10です。データベースの場合、Linuxカーネルがメモリページをディスクにスワップする積極性を調整するために、5を推奨します。
- Hugepagesが設定されていない。パフォーマンス、メモリ効率、および共有メモリのページアウトを防ぐために、巨大なページメモリ空間を使用します。HugePagesを共有メモリ量よりはるかに大きく指定することはお勧めしません。なぜなら、未使用のメモリが他のコンポーネントで使用できなくなるからです。
- dirty_background_ratioのパラメータは10 です。InterSystems では、このパラメータを 5 に設定することを推奨しています。この設定は、pdflush がダーティページの書き込みを開始する前に、ダーティページで埋められるアクティブなメモリの最大パーセンテージです。
- dirty_ratio のパラメータは 30 です。インターシステムズでは、このパラメータを 10 に設定することを推奨しています。この設定は、タイムスライス中にプロセスがより多くの書き込みを許可される代わりに、ダーティバッファを自ら書き込むように強制される前に、ダーティページで満たすことができる総メモリの最大割合を示します。これらの変更により、Linuxのpdflushデーモンは、ストレージに大量の更新が殺到する可能性のあるキューを作成するのではなく、より頻繁にダーティページを書き出すように強制されます。
お勧め:
- 上記の注意を見直し、修正してください。。
- HugePagesを設定し、IRISのドキュメントを参照してください: https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GCI_prepare_install#GCI_memory_big_linux
- 総メモリ量は128,755MB、総メモリ量の75%は96,566MBです。
- 共有メモリ(グローバル+ルーチン+gmheap)は73,703MBです。(総メモリの57%)です。
- ( 73,703 MB + 5% バッファ = 77,388 MB ) のページサイズ 2048 KB の HugePages 数は、38694 です。
このホストのすべてのインスタンスは:
- >SHADOW 2018.1.4.505.1.a 56772 /cachesys
```
---
記事
Toshihiko Minamoto · 2021年4月28日
数年ほど前、Caché Foundationsの講座(現「[Developing Using InterSystems Objects and SQL](https://www.intersystems.com/support-learning/learning-services/classroom-learning/course/developing-with-intersystems-objects-and-sql/)」)において、%UnitTestフレームワークの基礎を講義していたことがあります。 その時、ある受講者から、ユニットテストを実行している間に、パフォーマンス統計を収集できるかどうかを尋ねられました。 それから数週間後、この質問に答えるために、%UnitTestの例にコードを追加したのですが、 ようやく、このコミュニティでも共有することにしました。
Processクラスの%SYSTEMには、プロセスについて収集可能なメトリクスが(所要時間以外に)いくつか提供されています。
所要時間
実行された行
グローバル参照
システムCPU時間
ユーザーCPU時間
ディスク読み取り時間
上記の統計を収集する任意のユニットテストを有効にするには、%UnitTest.TestCaseのサブクラスを作成してプロパティを追加します。
Class Performance.TestCase Extends %UnitTest.TestCase
{
Property Duration As %Time;
Property Lines As %Integer;
Property Globals As %Integer;
Property SystemCPUTime As %Integer;
Property UserCPUTime As %Integer;
Property DiskReadTime As %Integer;
}
作成する特定のユニットテストは、%UnitTest.TestCaseではなく、新しいサブクラスから継承されている必要があります。
サブクラスではOnBeforeOneTest()を使って、各ユニットテストの統計データを初期化します。 DiskReadTime以外、現在値でプロパティを初期化します。
/// パフォーマンス統計を初期化します
Method OnBeforeOneTest(testname As %String) As %Status
{
// 現在の値で初期化します
set ..Duration = $zh
set ..Lines = $system.Process.LinesExecuted()
set ..Globals = $system.Process.GlobalReferences()
set ..SystemCPUTime = $piece(CPUTime, ",", 1)
set ..UserCPUTime = $piece(CPUTime, ",", 2)
// ディスク時間を0にリセットし、カウントを開始します
do $system.Process.ResetDiskReadTiming()
do $system.Process.EnableDiskReadTiming()
return $$$OK
}
OnAfterOneTest() を使って、各ユニットテストの統計データを確定します。 DiskReadTime以外、現在の値から初期値を減算します。
/// パフォーマンス統計を確定します
/// ここに、分析用にカウンターを別のテーブルに保存するためのコードを追加できます。
Method OnAfterOneTest(testname As %String) As %Status
{
set ..Duration = $zh - ..Duration
set ..Lines = $system.Process.LinesExecuted() - ..Lines
set ..Globals = $system.Process.GlobalReferences() - ..Globals
set CPUTime = $system.Process.GetCPUTime()
set ..SystemCPUTime = $piece(CPUTime, ",", 1) - ..SystemCPUTime
set ..UserCPUTime = $piece(CPUTime, ",", 2) - ..UserCPUTime
// ディスク読み取り時間を取得し、カウントを停止します
set ..DiskReadTime = $system.Process.DiskReadMilliseconds()
do $system.Process.DisableDiskReadTiming()
// ユニットテストログにメッセージを追加します
set msg = "Performance: " _
"Duration: " _ ..Duration _
", Lines: " _ ..Lines _
", Globals: " _ ..Globals _
", System CPU Time: " _ (..SystemCPUTime / 1000) _
", User CPU Time: " _ (..UserCPUTime / 1000) _
", Disk Read Time: " _ (..DiskReadTime / 1000)
do $$$LogMessage(msg)
return $$$OK
}
ちょっとした技がもう1つあります。 統計を収集するかしないかを指定して、ユニットテストを実行したほうが良いかもしれません。 したがって、ユニットテストを呼び出すコードに引数(%Boolean 1または0)を追加し、何らかの方法で渡す必要があります。 テストを実際に実行するメソッド(RunTest() またはほかのRun*() メソッドの1つ)は、第3引数に配列を取り、参照形式で渡します。 次は、そのサンプルコードです。
// logging引数(1または0)を保持する配列を作成し、それを参照で渡します
set p("logging") = logging
do ##class(%UnitTest.Manager).RunTest(test, qualifiers, .p)
配列に渡す値は、OnBeforeOneTest() と OnAfterOneTest() でアクセスできます。 これを両方のメソッドの最初の行に追加します。
if (..Manager.UserFields.GetAt("logging") = 0) { return $$$OK }
以上です! 皆さんのご質問、コメント、その他のアイデアをぜひお聞かせください。
記事
Megumi Kakechi · 2021年4月16日
これは InterSystems FAQ サイトの記事です。
ジャーナル切り替えのタスクが実行時にエラー(例:FILEFULL)となり、その原因となるエラーを解消後も一時停止(Suspend Leave)状態となっているのであれば、以下の操作により復旧可能です。
管理ポータル: [システムオペレーション] > [タスクマネージャ] > [タスクスケジュール表示] より、以下の操作を行います。
ジャーナル切り替え(Switch Journal) "詳細" をクリック
"一時停止" をクリック
タスク実行が一時停止された場合にタスクを再スケジュールしますか? はい
"すぐに実行する" をクリック
"再開" をクリック
"すぐに実行する"
タスク詳細にて "一時停止:"が空欄になり、"次回スケジュール時刻:" が再開後の次のスケジュール(例えば2021-04-17 00:00) になっていれば、復旧完了です。
こちらの方法で一時停止状態が解消しない場合は、診断レポート※(^SystemCheck/^Buttons)とタスクの情報(以下の手順で取得)をサポート宛てにお送りいただいた上、ご連絡ください。
※InterSystems IRISトラブル対応ガイド~情報収集編~(^SystemCheck/IRISHungの使い方)Caché/Ensembleトラブル対応ガイド~情報収集編~(Buttons/CacheHungの使い方)
%SYS>do ^TASKMGR 1) タスク作成2) タスク編集3) タスク一覧4) タスク削除5) タスク一時停止6) タスク再開7) タスク実行8) タスクリポート9) タスクマネージャオプション10) 終了 オプション?8 // 8 を入力して <Enter> 1) タスクスケジュール2) タスク詳細3) タスク履歴4) タスク履歴詳細5) 実行予定タスク6) 終了 オプション?2 // 2 を入力して <Enter> どのタスクの詳細を表示しますか? (*=すべて)? // ? を入力して <Enter> ID タスク名 タスクタイプ一時停止 1) ジャーナル切り替え System 2) ジャーナルファイル削除 System 3) タスク削除 System 4) 整合性チェック System Suspend Reschedule 5) セキュリティスキャン System 6) 診断レポート System 7) 監査データベースのパージ System 8) インベントリスキャン System 9) エラーとログファイルを削除 System 10) ロギングアクティビティチェックSystem 11) バックアップログの削除 System 12) ZEN レポートの一時ファイルを削除System 13) 機能トラッカー System 14) SQL クエリ統計情報を更新 System 15) 凍結プランをスキャン System 16) SQL ステートメント・インデックスをクリーンアップSystem 1000) Mirror Monitor Launch Task User どのタスクの詳細を表示しますか? (*=すべて)1 ジャーナル切り替え // 1 を入力して <Enter> ------------------タスク名: ジャーナル切り替え説明: 毎日零時にジャーナルファイルの切り替えを行いますタスクタイプ: Systemネームスペース: %SYSタスククラス: %SYS.Task.SwitchJournalバッチモード: 0優先度: Normal一時停止:開始時に再スケジュール:1Suspend on Error*: 0タスク実行: 日次、 毎日実行間隔: 00:00:00 に一度MirrorStatus*: Any次のスケジュール日付: 2021-04-11次のスケジュール時間: 00:00:00開始日付: 2021-02-16終了日付: None最終開始: 2021-04-10 05:30最終完了: 2021-04-10 05:30最終状態: 最終結果: curfile^JRNSWTCH%ER 日付: 04/10/2021%ERエラー#: 61217ID: 1
記事
Mihoko Iijima · 2021年9月24日
これは InterSystems FAQ サイトの記事です。
システムユーティリティクラスを利用したプログラムを作成することで出力できます。
【注意1】出力データの区切り文字がカンマではなくタブで出力されます点、ご注意ください。
【注意2】エクセルでタブ区切りのファイルを開くため、エクセルの開くメニューから出力したファイルを開いてください。
処理概要は以下の通りです。
1) %SYSTEM.SQL クラス(※)の Execute() メソッドを使用します。
第1引数:SQL文を指定します。
第2引数:内部日付が格納されている場合 yyyy-mm-dd で出力されるように表示モードを切り替えます。(1:odbcモード)
詳細は下記ドキュメントページおよびクラスリファレンスをご参照ください。
ドキュメント - $SYSTEM.SQL.Execute()【IRIS】クラスリファレンス - $SYSTEM.SQLクラス - Execute()メソッド【IRIS】
ドキュメント - $SYSTEM.SQL.Execute()クラスリファレンス - $SYSTEM.SQLクラス - Execute()メソッド
※ %SYSTEMパッケージ以下クラスは $system 特殊変数を利用してメソッドを実行できます。
set rset=$system.SQL.Execute("ここにSQL文",1)
2) 実行結果は %SQL.StatementResult クラスのインスタンスで返ります。
%DisplayFormatted() メソッドを使用して検索結果のファイル出力を実行します。
// 第1引数:出力形式の指定
// 0:XMLファイル出力
// 1:HTMLファイル出力
// 99:タブ区切りのテキストファイル出力)
// 100:CSVファイル出力《注意:タブ区切りで生成されます》 【注意3】参照
// 第2引数:出力ファイル名の指定(ファイルの拡張子を付けずにフルパスで指定)
// 【注意】Caché/Ensembleサーバ上に出力されます
// 第3引数:実行結果の取得用変数(参照渡しのため、先頭にピリオド付与)
do rset.%DisplayFormatted(99,"c:\kit\test",.pMessages)
上記 1) 2) の処理をまとめてストアドプロシージャとして利用できるサンプルをご用意しています。
https://github.com/Intersystems-jp/FAQ-SQLtoCSVUtility
検索対象テーブルが存在するネームスペースにインポートしてご利用ください。
サンプル実行例は以下の通りです(ターミナルでの実行例)。
// 実行したいSQLを変数に設定
set sql="SELECT OrderID, ItemName, Quantity, OrderDate FROM Test.FruitsOrder"
// インポートしたクラスメソッドを実行します。1が返れば成功です
write ##class(ISJSQL.Utils).ToCSV(sql,,"c:\kit")
メソッドの引数詳細は、クラスメソッドの説明文(Utils.cls 4~12行目) をご参照ください。
出力結果は、第3引数に指定したディレクトリ以下に yyyymmddhhmmss.拡張子 の形式で出力されます(拡張子は、メソッドの第2引数で指定する形式により異なります)。
ストアドプロシージャの実行を管理ポータルから行う手順は以下の通りです。
管理ポータル > システムエクスプローラー > SQL の画面を開きサンプルをインポートしたネームスペース移動後、ISJSQL.Utils_ToCSV()を実行します。
出力結果は、第3引数に指定したディレクトリ以下に yyyymmddhhmmss.拡張子 の形式で出力されます(拡張子は、メソッドの第2引数で指定する形式により異なります)。
関連記事
管理ポータルから任意のSQL実行結果をCSVファイルに出力する方法
記事
Mihoko Iijima · 2023年3月3日
開発者の皆さん、こんにちは!
IRISのRESTディスパッチクラスのデバッグがVSCodeで簡単にできるようになりましたので、利用手順についてご紹介します。
ObjectScriptエクステンション バージョン2.4.0 に追加されています。 のアイコンクリック時に表示されるエクステンション一覧でObjectScriptエクステンションに「Update」と表示されている場合は、更新を行ってください。
事前準備
まずは、RESTディスパッチクラスが保存されているIRISのネームスペースにVSCodeから接続する必要があります。
接続方法は以下2種類あります。
その1:ワークスペース単位に設定するsettings.jsonにIRISのサーバ情報と接続情報を設定する
設定詳細:VSCode を使ってみよう!
ビデオでの解説:InterSystems IRIS で開発をはじめよう!(22:35頃~)
ワークスペース単位にIRISのサーバ情報(ホスト名、ポート番号、接続ユーザ名)と、IRISへの接続情報(サーバ情報で作成したサーバ名、ネームスペース)を指定します。
その2:ユーザ単位に設定するsettings.jsonにIRISのサーバ情報を設定し、ワークスペース単位に設定するsettings.jsonに使用するサーバ情報のみを指定する。
設定詳細:VSCode を使ってみよう (2021年4月20日版)
VSCodeを使用するユーザ単位でIRISのサーバ情報(ホスト名、ポート番号、接続ユーザ名)を固定情報として設定します。ワークスペースに設定するsettings.jsonには、IRISへの接続情報(サーバ情報で作成したサーバ名、ネームスペース)のみを設定します。
デバッグ方法
ObjectScriptエクステンションで提供される「Debug REST Service」メニューでデバッグが実行できます。
図解のクラスでお試しいただく場合は、こちら👉https://github.com/Intersystems-jp/RESTDebug-VSCode をご利用ください。
※ObjectScriptエクステンションの最新をご利用ください。
手順は以下の通りです。
1) デバッグ対象メソッドにブレークマークを設定します。
上の図例では、ワークスペース上のソースコードに対してブレークマークを設定していますが、 をクリックしサーバ側コードに対してブレークマークを設定しデバッグを開始することもできます。
2) ソースコード上で右クリック→「Debug REST Service」を選択 します。
3) HTTPメソッドとURLを指定します。
4) クエリパラメータがあれば「QUERY PARAMETERS」タブで指定します。
3) の画面のURLに ? を使用してクエリパラメータを追加できません。「QUERY PARAMETERS」をご利用ください。
5) Bodyの指定が必要であれば「BODY」タブで指定します。
6) Start Debuggingボタンをクリックしてデバッグを開始します。
開始後は、以下のボタンを利用してデバッグを進めます。 デバッグ終了時は「Stop」を押して終了してください。
ぜひ皆さんのお手元でも試してみください!
次の記事では、VSCodeの「Debug REST Service」を使わずに、外部クライアント(RESTクライアントなど)からHTTP要求を実行し、処理中のIRIS内プロセスにアタッチしながらデバッグを行う方法をご紹介します。
記事
Toshihiko Minamoto · 2023年5月2日
InterSystems 2022.2 では、IRIS SQL テーブルを永続化する新しいオプションとして、[分析クエリを桁違いに向上](http://learning.intersystems.com/course/view.php?id=2077)させられる[カラムナーストレージ](https://learning.intersystems.com/course/view.php?name=ColumnarIntro)を導入しました。 2022.2 と 2022.3 ではこの機能は実験的としてマークされていますが、次の 2023.1 リリースでは、完全にサポートされた本番機能に「卒業」する予定です。
[製品ドキュメント](https://docs.intersystems.com/iris20222/csp/docbook/DocBook.UI.Page.cls?KEY=GSOD_storage)とこの[紹介動画](https://learning.intersystems.com/course/view.php?name=ColumnarIntro)では、IRIS では現在でもデフォルトであり、全顧客ベースで使用されている行ストレージと、このカラムナーストレージの違いがすでに説明されており、ユースケースに適切なストレージレイアウトの選択方法に関する大まかなガイダンスが提供されています。 この記事では、このテーマについて詳しく説明し、業界で実践されているモデリング原則、内部テスト、および早期アクセスプログラム参加者からのフィードバックに基づく推奨事項をいくつか紹介します。
全般的に、IRIS SQL スキーマに適したテーブルレイアウトを選択するためのガイダンスは以下のとおりです。
1. **EHR、ERP、またはトランザクション処理アプリケーションなど、IRIS SQL またはオブジェクトを利用するアプリケーションをデプロイしている場合は、現在の行ストレージレイアウトをカラムナーストレージレイアウトに変更する必要はありません。**エンドユーザーやプログラムトランザクションに対して発行されるほとんどの SQL クエリは、限られた数の行のみを取得または更新し、結果行は通常テーブルの行に対応しており、集計関数の使用もほんのわずかです。 カラムナーストレージとベクトル化されたクエリ処理から得られるメリットはこのような場合に適用されません。
2. **そのようなアプリケーションに運用分析も組み込まれおり、対応する分析クエリの現在のパフォーマンスが満足いくものでなければ、列インデックスの追加を検討してください。**これには、現在のインベントリを表示するダッシュボードやライブデータに関する基本的な財務レポートなどが含まれます。 集計に使用される数値フィールド(数量、通貨など)または範囲条件で使用されるカーディナリティの高いフィールド(タイムスタンプなど)を探します。 そのような可能性を示すのに適した指標は、通常カーディナリティの低いフィールド(カテゴリカルフィールドや順序フィールドなど)で大量の行のフィルタリングを高速化するビットマップインデックスの現在の使用状況です。 これらのビットマップインデックスを置き換える必要はありません。追加の列インデックスはそれらと連携して十分に動作し、マスターマップまたは通常のインデックスマップ(行あたり 1 つの gref)からの過剰な読み取りを回避することが目的です。
3. **IRIS SQL テーブルに含まれる行数が 100 万行未満である場合、カラムナーストレージを検討する必要はありません。**具体的な数に固執したくはありませんが、ベクトル化されたクエリ処理のメリットが、これらの低い範囲に影響を及ぼす可能性はありません。
4. **IRIS SQL スキーマをデータウェアハウス、ビジネスインテリジェンス、または同様の分析ユースケースにでデプロイしている場合は、カラムナーストレージがデフォルトとなるように変更することを検討してください。**スタースキーマ、スノーフレークスキーマ、またはその他の非正規化されたテーブル構造、およびビットマップインデックスとバッチインジェストの広範な使用は、これらのユースケースが該当することを示しています。 カラムナーストレージのメリットがある分析クエリは、大量の行をスキャンし、それらの値を集計するクエリです。 「カラムナーテーブル」を定義する場合、IRIS は、ストリーム、ロング文字列、またはシリアルフィールドなど、カラムナーストレージに適していないテーブル内の列に行レイアウトを透過的に使用します。 IRIS SQL はこのような混合テーブルレイアウトを完全にサポートしており、クエリプランの適切な部分にベクトル化されたクエリ処理を使用します。 カラムナーテーブルに対するビットマップインデックスの付加価値は限られているため、省略できます。
**環境とデータ関連のパラメーターによって、向上の程度は異なります。 したがって、代表的なセットアップで様々なレイアウトをテストすることを強くお勧めします。**列インデックスは、通常の行編成テーブルに簡単に追加でき、クエリパフォーマンスのメリットについて現実的な見通しを素早く生成することができます。 これは、混合テーブルレイアウトの柔軟性とともに、InterSystems IRIS の重要な差別化要因であり、桁違いのパフォーマンス改善を達成するのに役立ちます。
完全な本番リリースで実際のエクスペリエンスをさらに得るにつれ、これらの推奨事項をより具体化していく予定です。 もちろん、早期アクセスプログラムと POC エンゲージメントでは、お客様の実際のスキーマとワークロードに基づくより具体的なアドバイスを提供できます。お客様とコミュニティメンバーからのフィードバックを楽しみにお待ちしています。 カラムナーストレージは、InterSystems IRIS Advanced Server ライセンスの一部であり、InterSystems IRIS と IRIS for Health の Community Edition でも有効になっています。 完全にスクリプト化されたデモ環境については、[こちらの GitHub リポジトリ](https://github.com/bdeboe/isc-taxi-demo)をご覧ください。 カラムナーストレージに関しては、IRIS 2022.3のリリースセミナーにて紹介されています。
ご興味のある方は、こちらをご覧ください。
記事
Mihoko Iijima · 2023年3月5日
開発者の皆さん、こんにちは!
1つ前の記事では、VSCodeのObjectScriptエクステンションに追加されたRESTサービスのデバッグツールについてご紹介しましたが、この記事では、RESTクライアントなどからHTTP要求を実行し、処理中のIRIS内プロセスにアタッチしながらデバッグを行う方法についてご紹介します。
事前準備などは、前回の記事と一緒になりますのでこの記事では割愛します。
図解のクラスでお試しいただく場合は、こちら👉https://github.com/Intersystems-jp/RESTDebug-VSCode をご利用ください。
この方法では、HTTP要求時に実行しているIRIS内プロセスを特定する必要があります。
そのため、デバッグ対象のメソッドで処理を待機させるため、hang 20のようにhangコマンドをコード中に追加して試します。
手順は以下の通りです。
1) プロセスにアタッチしてデバッグを行うため、launch.jsonを作成する。
VSCodeのデバッグ用ファイル:launch.jsonファイルを作成し、アタッチ用の設定を行います。
作成方法詳細は、VSCode:プロセスにアタッチしてデバッグする方法の「手順1:launch.json の用意」をご参照ください。
例)
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "objectscript",
"request": "attach",
"name": "アタッチデバッグ練習",
"system": true,
"processId": "${command:PickProcess}"
}
]
}
2) デバッグ対象メソッドにHangコマンド追加します。
Hangを利用して処理を数秒待機させ、その間に実行中プロセスを特定します。ブレークポイントを置きたい行の前あたりにhangコマンドを追加してください(20~30秒待機するように記述します)。
hang 20
VSCodeでコードを編集するためには、ワークスペース内にクラス定義用ファイル(*.cls)を配置する必要があります。
サーバ側にあるコードに追記したい場合は、ワークスペースにエクスポートしてから追記します。
エクスポートは、サーバ側の対象コードを右クリックし「Export」を選択します。(下図参照)
Export実行後、ワークスペースに移動します。エクスポートファイルは、/src/パッケージ名/クラス名.clsの形式でワークスペースにエクスポートされます。
対象クラスを開き、コードを追記します。
コードの追記が終わったら、Ctrl+Sで保存します(保存+コンパイルが実施されます)。
3) 外部クライアントからHTTP要求を実行します。
例は、PostmanからPOST要求でクエリパラメータとBodyに文字列を指定しています。
Sendボタンを実行すると、2) で指定したHangコマンドが実行されるため、指定秒数待機します。
この間に、アタッチ対象プロセスを探します。
4) アタッチ対象プロセスにアタッチする。
3) の実行後すぐ、VSCodeのデバッグウィンドウを開き、launch.jsonで指定したデバッグ名(例では、「アタッチデバッグ練習」)をクリックし、プロセスリストを表示させます。
プロセスリストには「RESTディスパッチクラス名.*」(*には数字が入ります)の形式で処理中ルーチン名が表示されます。
対象プロセスを見つけたら行をクリックしプロセスにアタッチします。
注意:指定したhangの秒数の間にプロセスを見つけてアタッチしてください。
5) デバッグを実行する。
Hangコマンドの実行が終わると、ブレークマークのところでデバッグが一時停止します。
後は、デバッグ用アイコンを利用してデバッグを進めるだけです。
6) デバッグを終了する。
最後に、デバッグ停止のボタンを押して終了します。
メモ:
アタッチ用プロセス一覧に対象プロセスが表示されない場合は、一旦VSCodeを再起動して再度お試しください。
アタッチのデバッグを実行するために追加したhangコマンドはデバッグ終了時必ず削除/コメント化してください。
いつも記事をいろいろと参考にさせていただいております!本記事の内容において、RESTのデバッグを実行してみたところブレイクポイントでは止まっているように見えるのですが、ソースがコンパイルされたルーチンに切り替わり先頭のところから動かない状態となっております。(ステップオーバーやステップインをしてもクラスファイル上のソースで動かない)
設定等でなにか不足なものや確認するべき点はありますでしょうか?環境 OS:Windows 11 IRIS:IRIS for Windows (x86-64) 2023.1.5 (Build 697U) Thu Oct 3 2024 13:47:51 EDT [Health:5.1.0-4.m2023.1.5] VSCode:バージョン: 1.101.2 (system setup) Extension類:InterSystems ObjectScript - 3.0.4 @Kazuma.Watanabe さん、ご報告ありがとうございます。
接続したIRISのバージョンは異なりますが(2025.1 (Build 230.2U))同じようにクラスファイル上でステップインなどのデバッグボタンが動かない事を確認しました。
解決方法の確認も含め、一旦 ObjectScript extentionリポジトリの issues に登録してみました。
https://github.com/intersystems-community/vscode-objectscript/issues/1607 @Mihoko.Iijima 様ご確認、ご対応ありがとうございます!ObjectScript extention の Issues の対応状況もWatchしておきたいと思います。 @Kazuma.Watanabe さん、Web アプリケーションパスの設定によって、正しくデバッグできるときとできないときがあるようです(バグではないようです)。
https://github.com/intersystems-community/vscode-objectscript/issues/1607#issuecomment-3058191233
私が試したときの設定は以下の通りです(正しくデバッグ行が表示されないときの設定)。
UnknownUserにロールを付与していない
RESTで使用するウェブアプリケーションパスの認証が「認証なし」
ウェブアプリケーションパスの「アプリケーションロール」に%Allを付与している
以下のどちらかの設定を変えると正しくデバッグ行が表示されるようになりました。
A) ウェブアプリケーションパスの「認証なし」のチェックを外し「パスワード」に変更(アプリケーションロールは%Allがあってもなくてもどちらでも動作しました)
B) ウェブアプリケーションパスは「認証なし」を設定 +「アプリケーションロール」から %Allロールを外す + UnknownUser に %All ロールを付与する
上記AかBの設定で一度お試しいただけないでしょうか。
ご確認よろしくお願いします! @Mihoko.Iijima 詳細なご説明ありがとうございます。Aのパターンにて実施したところ、正常にブレイクポイント行で止まりソースも追うことができました。Bパターンにつきましてはまた時間のあるときに試してみたいと思います。
記事
Toshihiko Minamoto · 2022年2月3日
キーワード: Pandasデータフレーム、IRIS、Python、JDBS
## 目的
PandasデータフレームはEDA(探索的データ分析)に一般的に使用されるツールです。 MLタスクは通常、データをもう少し理解することから始まります。 先週、私は[KaggleにあるこちらのCovid19データセット](https://www.kaggle.com/S%C3%ADrio-Libanes/execution)を試していました。 基本的に、このデータは1925件の遭遇の行と231列で構成されており、タスクは、患者(1つ以上の遭遇レコードにリンク)がICUに入室するかどうかを予測するものです。 つまりこれは、いつものようにpandas.DataFrameを使用して、まず簡単にデータを確認する、通常の分類タスクです。
現在では、[IRIS IntegratedML](https://github.com/intersystems-community/integratedml-demo-template)が提供されています。これには強力な「AutoML」のオプションに関する洗練されたSQLラッパーがあるため、従来型のMLアルゴリズムに対抗して、多様なデータフレームのステージをIRISデータベーステーブルに保存してから、IntegratedMLを実行する方法を頻繁に採用しています。 ただし、[dataframe.to_sql()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html)はまだIRISで機能しないため、実際には、ほとんどの時間を他のデータ保存手段をいじることに充てていました。 いわば、土曜の朝の楽しい朝食の時間に素敵なオムレツを作ろうとしていたのに、一日中コンロの下で、ガスとシンクの配管作業をしていたような状況です。 さて、完璧ではありませんが、数週間後に忘れてしまわないように、簡単なメモを残しておくことにします。
## 範囲
IRISで[dataframe.to_sql()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html)を作成しませんでした。残念ながら、まだそこにはたどり着いていませんが、JDBC(JayDeBeApi)を介してデータフレームを動的に直接IRISに保存する簡単なPython関数をできるだけ単純かつ生の状態を維持してさくせいしました。 既知の問題(「MemoryError」)により、PyODBCではまだ機能しない可能性があります。
## 環境
以下のスクリプトのベースとして、[単純なdocker-coposeを介したこちらのIntegratedMLテンプレート](https://github.com/intersystems-community/integratedml-demo-template)を使って、テストしています。 [環境トポロジー](https://user-images.githubusercontent.com/8899513/85149599-7848f900-b21f-11ea-9b65-b5d703752de3.PNG)はGitHubリポジトリに含まれます。 IRISコンテナーに接続するには、こちらの[JDBC Jupyterノートブック](https://github.com/intersystems-community/integratedml-demo-template/blob/master/jupyter-samples/campaign-integratedml-jdbc.ipynb)を使用しています。
## テスト
### 1. dataframe.to_sql() をエミュレートするPython関数を定義する
ノートブックのセルで以下を実行しました。
def to_sql_iris(cursor, dataFrame, tableName, schemaName='SQLUser', drop_table=False ):
<span style="color:#999999;"> """"
Dynamically insert dataframe into an IRIS table via SQL by "excutemany"
Inputs:
cursor: Python JDBC or PyODBC cursor from a valid and establised DB connection
dataFrame: Pandas dataframe
tablename: IRIS SQL table to be created, inserted or apended
schemaName: IRIS schemaName, default to "SQLUser"
drop_table: If the table already exsits, drop it and re-create it if True; othrewise keep it and appen
Output:
True is successful; False if there is any exception.
"""</span>
if drop_table:
try:
curs.execute("DROP TABLE %s.%s" %(schemaName, tableName))
except Exception:
pass
try:
dataFrame.columns = dataFrame.columns.str.replace("[() -]", "_")
curs.execute(pd.io.sql.get_schema(dataFrame, tableName))
except Exception:
pass
curs.fast_executemany = True
cols = ", ".join([str(i) for i in dataFrame.columns.tolist()])
wildc =''.join('?, ' * len(dataFrame.columns))
wildc = '(' + wildc[:-2] + ')'
sql = "INSERT INTO " + tableName + " ( " + cols.replace('-', '_') + " ) VALUES" + wildc
#print(sql)
curs.executemany(sql, list(dataFrame.itertuples(index=False, name=None)) )
return True
基本的に、上記はIRISテーブルにデータフレームを動的に挿入しようとしています。 テーブルがすでに存在する場合は、完全なデータフレームがその最後にアペンドされますが、存在しない場合は、データフレームの次元(列名と列の型)に基づく新しいテーブルが作成され、その全コンテンツが挿入されます。 `executemanyメソッド`を使用しているだけです。
### 2. テスト - 生データファイルをデータフレームに読み込む
ノートブックで以下のコードを実行し、ローカルのドライブからデータフレームに生データを読み込みます。 生データは、[こちらのKaggleサイトからダウンロード](https://www.kaggle.com/S%C3%ADrio-Libanes/execution)可能です。
import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score, roc_curve
import seaborn as sns
sns.set(style="whitegrid")
import os
for dirname, _, filenames in os.walk('./input'):
for filename in filenames:
print(os.path.join(dirname, filename))
df = pd.read_excel("./input/raw_data_kaggle_covid_icu.xlsx")
df
./input/datasets_605991_1272346_Kaggle_Sirio_Libanes_ICU_Prediction.xlsx
Out[2]:
PATIENT_VISIT_IDENTIFIER
AGE_ABOVE65
AGE_PERCENTIL
GENDER
DISEASE GROUPING 1
DISEASE GROUPING 2
DISEASE GROUPING 3
DISEASE GROUPING 4
DISEASE GROUPING 5
DISEASE GROUPING 6
...
TEMPERATURE_DIFF
OXYGEN_SATURATION_DIFF
BLOODPRESSURE_DIASTOLIC_DIFF_REL
BLOODPRESSURE_SISTOLIC_DIFF_REL
HEART_RATE_DIFF_REL
RESPIRATORY_RATE_DIFF_REL
TEMPERATURE_DIFF_REL
OXYGEN_SATURATION_DIFF_REL
WINDOW
ICU
1
60th
0.0
0.0
0.0
0.0
1.0
1.0
...
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
0-2
1
1
60th
0.0
0.0
0.0
0.0
1.0
1.0
...
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
2-4
2
1
60th
0.0
0.0
0.0
0.0
1.0
1.0
...
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
4-6
3
1
60th
0.0
0.0
0.0
0.0
1.0
1.0
...
-1.000000
-1.000000
NaN
NaN
NaN
NaN
-1.000000
-1.000000
6-12
4
1
60th
0.0
0.0
0.0
0.0
1.0
1.0
...
-0.238095
-0.818182
-0.389967
0.407558
-0.230462
0.096774
-0.242282
-0.814433
ABOVE_12
1
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
1920
384
50th
1
0.0
0.0
0.0
0.0
0.0
0.0
...
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
0-2
1921
384
50th
1
0.0
0.0
0.0
0.0
0.0
0.0
...
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
2-4
1922
384
50th
1
0.0
0.0
0.0
0.0
0.0
0.0
...
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
4-6
1923
384
50th
1
0.0
0.0
0.0
0.0
0.0
0.0
...
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
-1.000000
6-12
1924
384
50th
1
0.0
0.0
1.0
0.0
0.0
0.0
...
-0.547619
-0.838384
-0.701863
-0.585967
-0.763868
-0.612903
-0.551337
-0.835052
ABOVE_12
1925 rows × 231 columns
### 3. テスト - Python over JDBCでIRIS DBに接続する
import jaydebeapi
url = "jdbc:IRIS://irisimlsvr:51773/USER"
driver = 'com.intersystems.jdbc.IRISDriver'
user = "SUPERUSER"
password = "SYS"
jarfile = "./intersystems-jdbc-3.1.0.jar"
conn = jaydebeapi.connect(driver, url, [user, password], jarfile)
curs = conn.cursor()
### 4. テスト - データフレームをIRISテーブルに保存する
iris_schema = 'SQLUser'
iris_table = 'Covid19RawTableFromCSV'
to_sql_iris(curs, df, iris_table, iris_schema, drop_table=True) # save it into a new IRIS table of specified name
#to_sql_iris(curs, df, iris_table) # append dataframe to an exsiting IRIS table
Out[4]: True
import pandas as pd
from IPython.display import display
df2 = pd.read_sql("SELECT COUNT(*) from %s.%s" %(iris_schema, iris_table),conn)
display(df2)
Aggregate_1
0
1925
したがって、全データが「`Covid19RawTableFromCSV`」というIRISテーブルに挿入されました。IRIS管理ポータルにログインすると、レコードが含まれるそのテーブルも表示されます。
### 5. テスト - 簡単なベンチマークを実行する
このデータフレームをたとえば10回挿入して、1つのJDBCセッションでこの基本的なCE dockerに掛かった時間を確認しましょう。
from tqdm import tqdm
import pandas as pd
import time
from IPython.display import display
start = time.clock()
for i in tqdm(range(0, 10)):
to_sql_iris(curs, df, iris_table)
print("Total time elasped: ", time.clock()-start, " for importing total records:")
df2 = pd.read_sql("SELECT COUNT(*) from %s.%s" %(iris_schema, iris_table),conn)
display(df2)
100%|██████████| 10/10 [00:14<00:00, 1.42s/it]
Total time elasped: 12.612431999999998 for importing total records:
Aggregate_1
0
19250
以上です。非常に基本的ではありますが、少なくともデータ分析パイプラインに沿って操作されたデータフレームを保存し、多少本格的なMLを試すために、SQLインターフェースを介してIntegratedMLを呼び出すことができるようになりました。
言及すべき**警告**: データフレームの文字列は、「オブジェクト」として解釈されることがあるため、df['column'].astype(str)などを使用して、IRISテーブルに挿入される前に文字列に変換する必要があります。 「DROP TABLE」は前のテーブルを上書きするために使用されます。 「DROP VIEW」は前のビューを削除するために使用できます。