如何将可变长度记录的长度增加到 32760 以上?

Posted

技术标签:

【中文标题】如何将可变长度记录的长度增加到 32760 以上?【英文标题】:How can I increase the length of variable-length record beyond 32760? 【发布时间】:2015-08-14 08:28:23 【问题描述】:

可变长度 QSAM 记录的最大记录长度为 32,760 字节。

我们文件的当前记录长度对我们来说是可以的,但为了处理更多信息,我们必须扩展此文件,使其长度超过 32K (LRECL > 32760)。

拆分记录对我们来说不是一个好的选择,因为它会影响我们现有的系统。

我不确定在这里使用带有 VSAM 的 SPANNED 记录是否可以解决这个问题。

//DEFINE EXEC PGM=IDCAMS
//SYSPRINT  DD SYSOUT=A
//SYSIN     DD *

  DEFINE CLUSTER (NAME(dsname.K1719) INDEXED VOLUMES(xxxxxx) -
         TRACKS(1) KEYS(17 19) RECORDSIZE(40 110) SPANNED) -
         DATA (NAME(dsname.K1719.DATA)) INDEX (NAME(dsname.K1719.INDEX))
/*
//

这会解决我们的问题吗?

【问题讨论】:

我假设最大块长度为 32k,而不是最大文件(或数据集)长度为 32k;你也试过看看会发生什么??? 这是愚蠢的(因为浪费了 DASD 超过 27998 块大小。有人为这个错误付出了代价,大概不是你。是的,VSAM 中的 SPANNED 将允许你一些相当大的记录。当然,额外的 CPU、额外的 IO (EXCPS) 和额外的存储会产生开销。所有成本。取决于你使用它的糟糕程度,以及你使用它的方式,可能会更长的运行时间。嘿,如果你觉得这是一种简单的方法,客户不介意为您最初糟糕的设计支付更多的费用,日复一日,然后去做吧。 最初的“设计”把你挖成了一个大整体。你可以侧身一点,但不修好设计就出不来。最容易做的事情是继续挖掘,并希望客户不介意增加成本,然后发现他们一直在支付的费用。显然我不建议这样做。 我同意比尔的观点,您需要查看文件的设计。如果涉及到很多程序,您就会发现为什么拥有一个访问复杂文件的“文件驱动程序”程序通常是个好主意,即应用程序-->文件-驱动程序-程序- ->文件。 @BillWoodger 思想大同小异,傻瓜永远不会不同;任你选 【参考方案1】:

如果您使用 Unix 系统服务文件,则不受 LRECL 的 32K 限制。 个下游效应。

如果您使用 COBOL 处理文件,您可以使用 LINE ORGANIZATION 子句中的 SEQUENTIAL,但随后您被限制为 1M LRECL。 如果您使用 COBOL 处理文件,则可以避开 COBOL I/O 并使用 C fopen() 等等来绕过 1M LRECL 上面提到的限制,但是你添加了一些东西 对于公认的假设 COBOL 应用程序来说是陌生的。 C 会 这些文件没有问题,我无法与 PL/I 交谈。 并非所有 DFSMS 和第三方实用程序都完全了解 Unix 系统服务 文件。 Unix 系统服务文件的 JCL 结构相对较短 学习曲线,但需要一点学习。 Unix 系统服务文件的安全性可能会让您感到反感 安全管理员。您可能会发现自己必须设置 通过setfacl 和其他新概念访问控制列表。

【讨论】:

这很有创意。希望它会激发 OP 回答他们提出的问题。【参考方案2】:

@cschneid 的回答很有趣。

如果不了解有关文件/应用程序的更多信息,很难给出具体答案。以下是可能有用的想法。

你可以:

将字帖分成几个子记录 向密钥添加一个额外的字节

所以而不是拥有

<key><a record>

你会的

<key><sub-key-1><part-1-of-record>
<key><sub-key-2><part-2-of-record>
<key><sub-key-3><part-3-of-record>
 ...

如果您有一个与文件交互的文件驱动程序程序, 您可以从应用程序中隐藏数据存储方式的详细信息。因此,您可以为每个逻辑记录拥有多个物理记录,并且您的应用程序不需要知道它。如果需要,您也可以拥有多个文件

请记住,您可以在不需要存储在文件中的新字帖末尾添加空格。当您需要向文件中添加字段时,这会派上用场 - 可以节省重新编译大量程序


文件是否包含逻辑上不同的数据(例如 salesorders 等),访问该文件的 每个程序 是否使用 整个记录???

如果是这样,您可以在 File-Driver-Program 的调用中添加请求类型:

   Call "FilePgm" using GET-ORDER  Order-Copybook
or 
   Call "FilePgm" using GET-SALES  Sales-Copybook 
or
   Call "FilePgm" using GET-EVERYTHING  Everything-Copybook 

拥有多个调用类型/副本的好处是,如果订单副本更改,仅使用销售副本不需要的程序需要重新编译,反之亦然。这将使将来更容易更改文件。


终于有Database Option !!!,要么一个

完全重写

或使用二进制blob。这些二进制 blob 的限制为 2gb

对于 DB2,您可以使用非常有用的 压缩。大型记录通常具有高压缩比。压缩的好处不是节省空间,而是减少了 IO。

【讨论】:

以上是关于如何将可变长度记录的长度增加到 32760 以上?的主要内容,如果未能解决你的问题,请参考以下文章

SAS - 导入不带分隔符的可变长度二进制记录

如何使用可变长度类型将包含多个 std::vector<float> 的结构写出到 HDF5?

在fortran中读取可变长度的实际值

在 countifs 中指定可变长度公式

将 scikits.learn.hmm.GaussianHMM 拟合到可变长度的训练序列

excel/VBA如何将数组的可变长度分配给整数变量