1

大きなテキストファイル(基本的にはcsv; stream_lf)の読み取りと処理を高速化する方法を探しています。

RMSをバイパスする必要がありますか?ソリューションは非同期または同期の場合があります。

現在の実装は同期的ですが、遅すぎます。

実装はHPPascalで行われ、pascalランタイムライブラリ(OPEN / READLN / EOF / CLOSE)を使用します。パスカルランタイムライブラリをバイパスすることは許容されます。

例としては、CまたはPascalがあります。

4

4 に答える 4

3

後続ファイルの場合:WASDまたはVWCMSコードを調べます(http://www.vsm.co.au/wasdを参照)。Webサービスの速度を優先してこれらのバイパスRMSも知っていますが、実行されている波止場の情報源ではわかりません。相対ファイルの場合、シーケンスを考慮に入れてください。レコードは存在しない(空ですか?)可能性があります。インデックスファイルの場合:しないでください。内部構造のため、代わりにRMSを使用してください(インデックスはこれらのファイルのデータと織り交ぜられています。新しい/再構成されたファイルでは問題ありませんが、メンテナンスが不足しているとRMSの外部へのアクセスに問題が発生します)

于 2012-10-10T11:31:47.823 に答える
1

うーん、ここで進むのはあまり具体的ではありません。

RMSがあなたを遅くしているという事実を知っていますか?

処理時間(IO、CPU、経過)をSEARCH / STAT / WIN = 0と比較します。1つの兆候は、低いUSERモード、高いEXEC、高いIDLEである可能性があります。MONI MODEを使用するか、EXECTIM、USERTIMでGETJPIを使用します

PASRTLを介した、または直接の最適なRMS読み取りは、おそらく、先読みがNOSHARINGまたは読み取り専用共有のいくつかの大きなバッファを意味します。

後で再試行してください:$ SET / RMS / BLO = 127 / BUF = 8!$!最近のOpenVMSバージョン(8.4、または8.3 +パッチ)の場合はBlock=255または128

小さなレコードが多数あり、EXECモードが高い場合、レコードを抽出するためにRMSに出入りする時間が長すぎる可能性があります。その場合は、CまたはCOBOLを試して、共有されていないファイルを読み取ってください。両方のRTL(ランタイムライブラリ)は、RMSオーバーヘッドを回避するためにIOを記録するのではなく、BLOCKIOを使用します。これらは、上記のRMSバッファ設定を引き続き尊重します。試す?

頑張って...どうやって理解するのか教えてください。おそらくいくつかの前後の数字。

乾杯、ハイン

于 2011-12-13T16:31:55.650 に答える
1

システムブロックが32に設定されている場合。SETRMS/BLOCK= 32 / BUF=8を試しました。それはすでに改善をもたらしました。

[編集:プロセス設定がない場合は、使用したシステム設定。したがって、テストでは追加のバッファーが実行されましたが、バッファーは大きくなりませんでした]

32はわずか16KBです。1992年には最適、2012年には不十分。より多くのバッファーがすでに役立っている場合は、より大きなバッファーがさらに役立つ可能性があります。大きいほど良いです。8KBの倍数は、ほんの少し余分に役立つかもしれません。したがって、128を試し、SETRMSプロセスレベルで255も試します。それが幸福をもたらす場合は、DCL設定に依存せずに、独自のRMS設定を選択するようにプロセスを調整することをお勧めします。

RMS $ GET呼び出しは通常、単一のレコードのみを取得しますが、SET FIL / ATTR =(RFM = UDF)またはおそらく(RFM = FIX、LRL = 8192)を使用して、ファイルについて「嘘をつく」ことができます。SYS $ MODIFYを使用して、プログラムで一時的にこれを行うことができます。その後、大きなチャンクで読み取ることができますが、プログラムはスプーフィングされたレコードの実際のレコードをデコードする必要があります。これは、SYS $ READ / SYS $ QIOW(BlockIO)を使用するのとよく似ていますが、記録モードに固執すると、「先読み」が無料になります。ええ、aysnc IOを使って自分でコーディングすることはできますが、それは面倒です。

ところで...バッファの数に夢中にならないでください。ベンチマーク(何年も前)では、10を超えると、ほとんどまたはマイナスのメリットが見られました。その理由は、RMSは「先読み」を行うが「先読み」は行わないためです。すべてのバッファーを非同期でいっぱいにしますが、バッファーが処理されるときに追加の読み取りを投稿しません。すべてのデータが消費された場合にのみ、すべてのバッファーに対してIOが再発行されます。代わりに、バッファーが処理されるときに先に進んでください。IOのこれらの「ウェーブ」はストレージサブシステムを混乱させる可能性があり、ウェーブの最初のIOは、残りのウェーブによって遅くなる可能性があります...そのため、プログラムは待機します。

どのくらいのデータが使用されていますか?数十メガバイトまたはギガバイト>XFCキャッシュは、エクスポートと処理の間にキャッシュするように変更されますか?

vriendelijkegroetjesに会いました。ハイン。

于 2011-12-13T22:41:03.607 に答える
1

Cを使用します。RMSをバイパスします。

ファイルを開きます。

fseektoend

ファイルサイズを取得するためにftell

そのサイズのメモリのチャンクをmallocします

一度にそれを恐れる

ファイルがワーキングセットよりもはるかに大きい場合は、ページングが壁掛け時計を食いつぶしているのではないかと疑う人もいるかもしれません。

于 2011-12-14T18:28:33.193 に答える