2009-07-14 113 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導入應用程序。