2009-07-14 54 views
4

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

我的问题是通过这个文件的最好方法是什么。一个告诫,我无法将文件移动到数据库服务器,并完全用数据库进行处理。但是,将每行传递到一个处理所有事情的存储过程会更高效吗?它仍然会对数据库进行大量的调用,但与我现在所拥有的相比并没有什么。另外,向用户提供有关已处理多少文件的反馈的最佳方法是什么?

编辑: 我运行CF 6.1

+1

我相信有一个请求参数,您可以设置,以增加超时到您选择的值。 – teabot 2009-07-14 17:45:25

+1

您是否尝试过? – Alex 2009-07-14 17:47:41

+0

我非常肯定,还有一个命令允许你从命令行执行一个CF页面 - 尽管如此,还没有用过它。 – teabot 2009-07-14 17:48:31

回答

0

SQL Server集成服务(SSIS)是复杂的ETL(提取,转换和加载)的工作,这是什么这听起来像的推荐工具。 (可以将其配置为访问其他服务器上的文件。)问题可能是,您是否可以在Cold Fusion和SSIS之间建立一个界面?

6

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

1)维护一个文件上传表(父表)。对于每一个文件,你上传你应该能够保持每个文件的列表,它是在(上传,处理,未处理)

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

3)保持处理状态 - 对于您携带的每一行数据文件,设置一个“process/unprocessed”标签。这样,如果它打破了,你可以从你离开的地方开始。当你贯穿每一行时,将其设置为“已处理”。

4)交易 - 如果可能,一次使用cftransaction或一次至少提交一行(使用您的5个查询)。这样,如果事情出现繁荣,则没有一行数据被计算/处理/更新/测试一半。

5)一旦你做了处理,设置在表中的文件名条目将被“处理”

通过使用上面的方法,如果事情失败了,你可以将它设置的地方开始第1步它离开了,或者至少有一个更清晰的路径开始调查,或者最糟糕的情况是清理数据。您将有一种清楚的方式向用户显示当前上传处理的状态,位置以及发生错误时的停止位置。

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

其他的想法:

  1. 您可以增加超时,给虚拟机的内存,把它在64位,但所有这些只会增加系统的容量那么大。每次打电话都要做到这一点,并与上述结合使用。

  2. Java有一些整洁的文件处理库可用作CFCS。如果遇到很多速度问题,可以使用其中一个将其读入一个变量,然后将其读入数据库中。如果您在使用XML,请不要使用coldfusion的xml解析。它适用于较小的文件,并适用于事情变得更大时。有几个cfc写在那里(检查riaforge等),它包装了一些优秀的java库来解析xml数据。如果需要使用此数据,则可以手动创建一个cfquery。

+0

感谢您解释您的方法,它为我提供了一些在CF中运行一些海量数据集的指导。 – JasonBartholme 2009-08-25 14:40:15

+0

很高兴它是有用的。我相信它不完整,至少是从学习什么不该做和形成的清单。祝你好运:) – 2009-08-26 15:43:38

4

如果没有更多的信息很难说,但从你说的话我发射出三个想法。

第一件事情是,有这么多的数据库操作,可能会产生太多的调试。确保在管理员的调试输出设置下关闭以下设置。

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

我会做的是看看那些数据库查询,并确保它们会被优化的第二件事。确保选择正在发生痕迹等

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

我会尝试使用文件循环通过文件循环:

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

如果你可以升级到CF8,并采取CFLOOP文件的优势=“”,它会给你更大的速度和文件不会被放在内存中(这可能是导致崩溃的原因)。

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

1

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

0

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

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

0

我必须做同样的事情,本纳德尔已经写了一堆大文章的使用Java文件IO,以让您更快速读取文件,写文件等...

真正帮助提高性能我们的csv导入应用程序。