みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもお世話になっております
毎日この掲示板で勉強していますがなかなか上達いたしません
いつもお世話になっております 高知食糧株式会社東川です質問ばかりで申し訳ありません
FilemakerServerのスケジュールでCSVデータのインポートを毎日を行っています
問題はこのインポートにものすごく時間がかかっているということなのです
アドミンコンソールのログを見ても10時間程度かかっています
スクリプトやテーブルの構成の変更で解消できるものなのでしょうか?
ご教授のほどよろしくお願いいたします
データの構成は
CSVファイル(URDTA.csv):59フィールド10万レコード程度
Filemaker側のテーブル[URDTA]:65フィールド320万レコード(現在)
CSVファイルのフィールドから計算する計算フィールドと集計フィールドが複数あります
また、CSVファイルはオフコンからの出力で固定長で出力されており、無駄なスペースを取り除くためテーブル側でTrimやGetAsNumberをかけています
インポートは2つのフィールドが一致するものを更新し、そうでないものを追加しています
使っているスクリプトは
・ユーザによる強制終了を許可 [ オフ ]
・エラー処理 [ オン ]
・レイアウト切り替え [ 「URDTA」 (URDTA) ]
・全レコードを表示
・変数を設定 [ $inpfilepath; 値:"filewin:" & Get ( ドキュメントパス ) & "URDTA.csv" ]
・レコードのインポート [ ソース: 「$inpfilepath」; ターゲット: 「URDTA」; 方法: 一致するレコードを更新; 一致しないレコードを追加する; 文字セット: 「シフト JIS」; フィールドデータのインポート順: ソースフィールド 1 の一致 URDTA::売上伝票№ ソースフィールド 2 の一致 URDTA::行№ ソースフィールド 3 のインポート ・・・・・
・全レコードを表示
・レイアウト切り替え [ 「menu」 (URDTA) ]
> CSVファイルはオフコンからの出力で固定長
というのは、各要素が固定長ということですか。
> 無駄なスペースを取り除くためテーブル側でTrimやGetAsNumberをかけています
は、自動入力の計算式で、それとも別のやり方?
時々、ファイルの最適化保存を行っていらっしゃいますか。ファイル内のフラグメンテーションによって、ファイルへのアクセスは非常に遅くなる事があります。
Offline
>というのは、各要素が固定長ということですか。
各要素は固定長です
使い辛いのでTrim等をかけています
>自動入力の計算式で、それとも別のやり方?
自動入力です「計算値自動入力 既存値を置き換え」
あ、伝票番号や顧客コード、日付コード等は索引を「すべて」にしています、、、これが原因?
>時々、ファイルの最適化保存を行っていらっしゃいますか。ファイル内のフラグメンテーションによって、ファイルへのアクセスは非常に遅くなる事があります。
サーバに置いてあるfmpファイルはどうすれば最適化できるのでしょうか?
アクティビティーの画面で「閉じる」で良いのでしょうか?
「インポート|一致するレコードの更新」は、かなり遅くなりますね。
更新するCSVファイルを別テーブルにキーのみインポートし、
実テーブルの対照レコードを判別・削除し、
「インポート|レコードの追加」でインポートした方が時間は短くなります。
がしかし、毎日10万件のレコードを追加・削除は、しない方が良いかどうか...?そこまで多くの件数を管理したことが無いので...。
あと、索引が多いとレコード削除が遅くなります。
あとは、必要のない過去のデータを退避する(可能なら)とか。
Offline
10万レコード -> 320万レコード(全レコード)(インポート|一致するレコードの更新)
では、時間がかかるので、
10万レコード -> 20万レコード(対象レコード)(インポート|一致するレコードの更新)
にすれば、短縮できます。
更新する対象のレコードが期間などで検索できれば、良いですが。
Offline
毎日作成されるCSVデータは当月1日から本日までのレコードです
オフコン側で月次更新が行われるまでは過去(当月内)のレコードも変更がある場合があります
それで毎日データを更新・追加を行っています
今までインポートされたテーブル(現在3年分があります)から当月分のものだけを別テーブルにエクスポートし、そのテーブルにCSVデータをインポートして追加更新を行い、元のテーブルの当月分を削除して、別テーブルのレコードをインポート(新規レコードとして追加)するのはどんなもんでしょうか?
思い付きなので詳しくは考えていないのですけれど、、(あいかわらず日曜大工です)
当月内ということであれば、検索して対象レコードを減らしてから、
「インポート|一致するレコードの更新」とするだけでもかなり早くなると思われます。
Offline
CSVには当月分の全データが入っているのだから、「一致するレコードの更新」をする必要はなく、当月分のデータを削除後、インポートすれば良いように見えます。
照合が不要になる分、読み込みは速くなる。ただし、削除に時間がかかるので、トータルで速くなるかどうかは分からない。
Offline
削除・追加だと凄まじいフラグメンテーションが起こるなー。
ならば、「既存のレコードを更新」ならどうでしょう。追加と所要時間は変わらないし、削除の必要も無いし、フラグメンテーションも起こらない。
Offline
皆様アドバイスありがとうございます
当月分というのはオフコン側で月次更新するまでは変化しません
今日1/6ではまだ月次更新が行われていないためオフコン側の当月は2016/12となっています
Filemaker側での当月は2017/01となってしまい、月次更新も決まった日に行われるわけではないので(15日前後)自動絞り込みは無理のようです
もう少し考えてみます
先ほど質問した問題ですが、FiemakerServerにホストされているfmpファイルの最適化はどうすればよいでしょうか?
FMS でホストしているファイルの最適化は、一度サーバーを止めるか、ファイルを閉じて、FMP で開き、最適化保存します。
対象とするレコードは先月以降の物に限られるのでは。先月以降のレコードを抽出しておけば良いでしょう。
また、テーブル内に、加工しない生データを入れておくフィールドと、実利用する加工した計算フィールドを作ればいかがでしょう。少しだけ早くなるかもしれません。
Offline
ありがとうございます
FMS上では(AdminConsoleからは)直接最適化はできないということなのですね
オフコンのUSB掃き出しの構成も変えてもらうように頼んでみました
FM上のテーブルで先月以降のものに絞り込んだ状態でインポートするようにしてみます
どうなったかはまた報告させていただきます
CSVファイルが日付順に並んでいれば、先頭行から日付を取得して、その日以降のレコードを検索しておいて既存レコードの更新できますね。
日付順になってなければ、良い方法思いつきません。
Offline
当月分というのはオフコン側で月次更新するまでは変化しません
今日1/6ではまだ月次更新が行われていないためオフコン側の当月は2016/12となっています
Filemaker側での当月は2017/01となってしまい、月次更新も決まった日に行われるわけではないので(15日前後)自動絞り込みは無理のようです
データに日付が、入っていないのでしょうか?
当月分というか、「2016/12」のデータをインポートする時は、FileMaker側で「2016/12」のデータを検索し対象レコードとしておけばよいのですが。
それにしても10時間とは、時間がかかりすぎのような...、原因の切り分けのためにもShinさんがおっしゃっているように自動処理無しでインポートしてみては?
Offline
Pages: 1
[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 548.87 KiB (Peak: 569.41 KiB) ]