【问题标题】:How can I speed up batch processing job in Coldfusion?如何加快 Coldfusion 中的批处理工作?
【发布时间】:2011-07-12 12:57:17
【问题描述】:

每隔一段时间,我都会收到一个大型数据文件,我的客户会上传该文件并需要通过 CMFL 进行处理。问题是,如果我将处理放在 CF 页面上,那么它会在 120 秒后遇到超时问题。我能够将处理代码移动到似乎没有超时问题的 CFC。但是,在处理过程中的某个时候,它会导致 ColdFusion 崩溃并必须重新启动。我通过的文件的每一行(8,000+)以及我以 CFML 形式提供的其他逻辑都需要许多数据库查询(5 个或更多,更新和选择的混合)。

我的问题是浏览此文件的最佳方式是什么。需要注意的是,我无法将文件移动到数据库服务器并完全使用数据库进行处理。但是,将每一行传递给一个处理所有事情的存储过程会更有效吗?对数据库的调用仍然很多,但与我现在所拥有的相比没有任何意义。此外,向用户提供有关文件已处理量的反馈的最佳方式是什么?

编辑: 我正在运行 CF 6.1

【问题讨论】:

  • 我相信您可以设置一个请求参数来将超时时间增加到您选择的值。
  • 你试过吗?
  • 我很确定还有一个命令可以让您从命令行执行 CF 页面 - 不过很长时间没有使用它了。

标签: sql-server-2005 stored-procedures coldfusion batch-file


【解决方案1】:

我只是做了类似的事情,经常使用 CF 进行数据解析。

1) 维护一个文件上传表(父表)。对于您上传的每个文件,您应该能够保留每个文件的列表以及它的状态(已上传、已处理、未处理) )

2) 临时表存储数据文件的所有行。 (子表) 将整个数据文件导入到临时表中。试图在内存中完成这一切将不可避免地导致一些错误。此表中的每一行都将链接到上面的文件上传表条目。

3) 保持处理状态 - 为您引入的数据文件的每一行设置一个“处理/未处理”标签。这样,如果它坏了,你可以从你离开的地方开始。遍历每一行时,将其设置为“已处理”。

4) Transaction - 如果可能的话,使用 cftransaction 一次性提交所有内容,或者一次至少提交一行(使用 5 个查询)。这样一来,如果某事进展顺利,您就没有一行数据是计算/处理/更新/测试的一半。

5) 完成处理后,将步骤 1 中表中的文件名条目设置为“已处理”

通过使用上述方法,如果出现故障,您可以将其设置为从上次中断的地方开始,或者至少有一个更清晰的路径来开始调查,或者在数据中清理最坏的情况。您将有一种清晰的方式向用户显示当前上传处理的状态,它在哪里,以及如果出现错误,它在哪里停止。

如果您有任何问题,请告诉我。

其他想法:

  1. 您可以增加超时时间、给 VM 更多内存、将其设置为 64 位,但所有这些只会大大增加系统容量。每次调用都执行这些操作并结合上述操作是一个好主意。

  2. Java 有一些简洁的文件处理库,可用作 CFCS。如果您在速度方面遇到很多问题,您可以使用其中之一将其读入变量,然后读入数据库

  3. 如果你在玩 XML,不要使用 Coldfusion 的 xml 解析。它适用于较小的文件,并且适用于更大的文件。有几个 cfc 写在那里(检查 riaforge 等),它们包装了一些用于解析 xml 数据的优秀 java 库。然后,如果需要,您可以手动创建一个 cfquery 来处理这些数据。

【讨论】:

  • 感谢您解释您的方法,它为我在 CF 中运行一些海量数据集提供了一些指导。
  • 很高兴它有用。我敢肯定它并不完整,至少是从学习不该做什么并得出这些形成的清单。祝你好运:)
【解决方案2】:

没有更多信息很难说,但从你所说的我得出了三个想法。

首先,有这么多的数据库操作,您可能会产生过多的调试。确保在管理员的调试输出设置下关闭以下设置。

  • 启用可靠的异常信息
  • 启用 AJAX 调试日志窗口
  • 请求调试输出

我要做的第二件事是查看这些数据库查询并确保它们已优化。确保选择与索引等一起发生。

我怀疑的第三件事是,在内存中挂起的文件可能不是最理想的。

我会尝试使用文件循环遍历文件:

<cfloop file="#VARIABLES.filePath#" index="VARIABLES.line">
    <!--- Code to go here --->
</cfloop>

【讨论】:

  • 看起来您可能打算在最后放一个代码示例?如果是这样,它就不见了。
【解决方案3】:

您是否尝试过事件网关?我相信这些线程与页面请求线程的超时设置不同。

【讨论】:

    【解决方案4】:

    SQL Server Integration Services (SSIS) 是用于复杂 ETL(提取、转换和加载)工作的推荐工具,听起来就是这样。 (它可以配置为访问其他服务器上的文件。)问题可能是,你能在 Cold Fusion 和 SSIS 之间建立一个接口吗?

    【讨论】:

      【解决方案5】:

      如果您可以升级到 cf8 并利用 cfloop file="" 这会给您更快的速度并且文件不会被放入内存(这可能是崩溃的原因)。

      根据您遇到的情况,您还可以使用 cfthread 来加快处理速度。

      【讨论】:

      • 是否可以在本地机器上安装开发者版并连接到数据库。这样,您就可以利用 CF8 的功能。我过去曾这样做过,但在你的情况下你可能无法做到。
      【解决方案6】:

      目前,事件网关是绕过 HTTP 请求周期超时限制的唯一方法。 CF 确实没有有办法离线处理 CF 页面,也就是说,没有命令行调用(我对 CF 最大的抱怨之一 - 很少有离线处理)。

      最好的办法是使用事件网关或直接用 Java 重写解析逻辑。

      【讨论】:

        【解决方案7】:

        我不得不做同样的事情,Ben Nadel 写了一堆很棒的文章,使用 java 文件 io,让您更快地读取文件,写入文件等......

        确实有助于提高我们的 csv 导入应用程序的性能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-22
          • 1970-01-01
          • 2015-04-05
          • 2018-08-23
          • 2015-08-29
          • 1970-01-01
          • 2017-08-11
          • 1970-01-01
          相关资源
          最近更新 更多