尝试在 Microsoft Dynamics AX 2009 中复制公司时出现“超出最大文件大小”错误

本文提供了一个解决方法,以确保可以在 Microsoft Dynamics AX 2009 中成功复制公司。

适用于: Microsoft Dynamics AX 2009
原始 KB 数: 2437099

现象

尝试在 Microsoft Dynamics AX 2009 中复制公司时,将收到一条错误消息,指出已超出最大文件大小。 NTFS 格式硬盘上有足够的可用空间(80 GB),并且计算机还配备了大量的 RAM(>=20 GB)和虚拟内存。

尝试复制或导入一个巨大的 .DAT 文件(9 GB)时,将引发以下错误消息:

“文件 C:\Users\Admin~1.SIN\AppData\Local\Temp$tmp0030005.$$$ 中写入记录时出错=FFFFEB40 Windows 错误: =

错误代码:50110 = 超出最大文件大小的操作将失败”

原因

这是 32 位文件大小限制(< 4 GB)。 副本处理过程使用一些临时表。当一个临时表达到特定大小时,它将不再保存在缓存中,而是将被写入硬盘上的一种 ISAM 文件。 此文件有一个限制,不能超过 4 GB。

解决方法

优化 .DAT 文件的导出/导入方法,有多种操作可以执行:

  1. 将类TmpRecIdMap中的TmpTransactionIdMap表和SysDataImport\classDeclaration表更改为使用实际表而不是临时表。 否则,这可能会占用计算机上可用的所有临时存储空间。

    旧代码:

    TmpRecIdMap old2NewRecId;
    TmpRecIdMap newRecId;
    TmpTableIdMap tmpTableIdMap;
    // Transaction id
    TmpTransactionIdMap old2NewCreatedTransactionId;
    TmpTransactionIdMap old2NewModifiedTransactionId;
    

    新代码示例(使用 4 个新表):

    //->ChangeBegin
    // TmpRecIdMap old2NewRecId;
    // TmpRecIdMap newRecId;
     DD_RecIdMapOldRecId old2NewRecId;
     DD_RecIdMapNewRecId newRecId;
    //<-ChangeEnd
     TmpTableIdMap tmpTableIdMap;
    
    // Transaction id
    //->ChangeBegin
    // TmpTransactionIdMap old2NewCreatedTransactionId;
    // TmpTransactionIdMap old2NewModifiedTransactionId;
     DD_TransactionIdMapCreated old2NewCreatedTransactionId;
     DD_TransactionIdMapModified old2NewModifiedTransactionId;
    //<-ChangeEnd
    

    下载附件中的示例 xpo,以用作更改的例子。

  2. 在 SQL Server 中,将日志记录级别设置为简单(在导入时防止过度日志记录)。

  3. 在 Microsoft Dynamics AX 2009 中,通过配置多个定义组导出多个单独的表组中的数据。

  4. 请确保将引用 RecId 的表与相关表保存在同一组中,否则 RecId 关系将无法维持。

  5. 确保数据库文件的大小设置得足够高,以便导入运行时不必增长。

  6. 设置下列选项:

    • 在 AOS 上执行:是
    • 请勿搜索现有记录:是
    • 索引:导入后重新编制索引
    • 使用记录编号压缩:是
  7. 在单独的客户端或甚至在单独的 AOS 上并行运行每个定义组的导入/导出。

使用这些选项将最大程度地提高性能,并将单次错误导致整个操作在并行运行单独导入时停止的风险降到最低。