1

寻找一种方法来加快读取和处理大型文本文件(基本上是 csv;stream_lf)。

我应该绕过 RMS 吗?解决方案可能是异步的或同步的。

当前的实现是同步的,但是太慢了。

在 HP Pascal 中实现,并使用 pascal 运行时库 (OPEN/READLN/EOF/CLOSE)。绕过 pascal 运行时库是可以接受的。

示例可能是 C 或 Pascal。

4

4 回答 4

3

对于顺序文件:查看 WASD 或 VWCMS 代码(查看http://www.vsm.co.au/wasd)。我知道这些绕过 RMS 也有利于 Web 服务的速度,但我不知道在 whar 来源中已经完成。对于相对文件,请考虑顺序。记录可能不存在(空?) 对于索引文件:不要。改用RMS,因为内部结构(索引与这些文件中的数据交织在一起。在新的/重新组织的文件中,没关系,但缺乏维护会导致在RMS之外访问时出现问题)

于 2012-10-10T11:31:47.823 回答
1

对于系统块设置为 32。我尝试了 SET RMS/BLOCK=32/BUF=8。这已经有所改善。

[编辑:如果没有进程设置,那么我们使用的系统设置。所以测试完成了添加缓冲区,但没有使它们变大]

32 只是 16KB。非常适合 1992 年,但对于 2012 年来说很糟糕。如果更多的缓冲区已经有所帮助,那么更大的缓冲区可能会提供更多帮助。越大越好。8KB 的倍数可能只是额外的帮助。因此尝试 128,并在 SET RMS 进程级别尝试 255。如果它带来快乐,那么您可能希望调整该过程以选择其自己的 RMS 设置,而不是依赖 DCL 设置。

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 缓存是否会在导出和处理之间缓存它?

遇到了 vriendelijke groetjes。海因。

于 2011-12-13T22:41:03.607 回答
1

嗯,这里没有太多具体内容。

您是否知道 RMS 会减慢您的速度?

将您的处理时间(IO、CPU、Elapsed)与 SEARCH/STAT/WIN=0 进行比较 一个指示可能是低 USER 模式、高 EXEC 更多、高 IDLE。将 MONI MODE 或 GETJPI 与 EXECTIM、USERTIM 一起使用

通过 PASRTL 或直接读取的最佳 RMS 可能意味着具有预读、不共享或只读共享的几个大缓冲区。

重试: $ SET /RMS/BLO=127/BUF=8 !美元!对于最近的 OpenVMS 版本(8.4 或 8.3+补丁),Block=255 或 128

如果有很多小记录,并且 EXEC 模式很高,则可能有太多时间进出 RMS 来提取记录。在这种情况下,请尝试 C 或 COBOL 来读取非共享文件。两者的 RTL(运行时库)都将使用 BLOCKIO,而不是记录 IO 以避免 RMS 开销。他们仍然遵守上面提到的 RMS 缓冲区设置。尝试?

祝你好运......让我们知道你是怎么做到的?也许有一些之前/之后的数字。

干杯,海因

于 2011-12-13T16:31:55.650 回答
1

使用 C。绕过 RMS。

f打开文件。

f寻求结束。

ftell获取文件大小

malloc一块这样大小的内存

一口气读完

有人可能会怀疑,如果您的文件比您的工作集大很多,那么分页可能会占用您的挂钟。

于 2011-12-14T18:28:33.193 回答