流動(dòng)分析工具化交叉引用相關(guān)申請(qǐng)本申請(qǐng)要求2011年1月7日提交、發(fā)明名稱(chēng)為“FlowAnalysisInstrumenta-tion(流動(dòng)分析工具化)”的美國(guó)臨時(shí)申請(qǐng)第61/430,625號(hào)的優(yōu)先權(quán),特此通過(guò)引用并入其全部?jī)?nèi)容。技術(shù)領(lǐng)域本發(fā)明涉及流動(dòng)分析。
背景技術(shù):數(shù)據(jù)流圖用于對(duì)數(shù)據(jù)進(jìn)行操作。將數(shù)據(jù)供給數(shù)據(jù)流圖。數(shù)據(jù)流圖對(duì)數(shù)據(jù)進(jìn)行一系列操作。在一些情形下,對(duì)數(shù)據(jù)進(jìn)行的一系列操作可以隨數(shù)據(jù)記錄而變。將小組的數(shù)據(jù)記錄用于測(cè)試數(shù)據(jù)流圖;但是,選擇一組數(shù)據(jù)記錄可能是困難的,因?yàn)樗x的該組數(shù)據(jù)記錄可能代表不了生產(chǎn)環(huán)境下的數(shù)據(jù)記錄。
技術(shù)實(shí)現(xiàn)要素:本說(shuō)明書(shū)描述與流動(dòng)分析有關(guān)的技術(shù)。一般說(shuō)來(lái),描述在本說(shuō)明書(shū)中的主題的一個(gè)方面可以用包括修改數(shù)據(jù)流圖的動(dòng)作的方法具體化,該數(shù)據(jù)流圖包括連接至少一個(gè)入口點(diǎn)和至少一個(gè)出口點(diǎn)的多條路徑。該修改數(shù)據(jù)流圖包括將把流動(dòng)單元加入數(shù)據(jù)記錄中和從數(shù)據(jù)記錄中除去流動(dòng)單元的部件加入數(shù)據(jù)流圖中,每個(gè)流動(dòng)單元標(biāo)識(shí)數(shù)據(jù)記錄穿過(guò)的一段路徑。該方法還包括根據(jù)使用所修改數(shù)據(jù)流圖處理多個(gè)數(shù)據(jù)記錄獲得的流動(dòng)單元識(shí)別執(zhí)行路徑的動(dòng)作。該方法還包括確定多個(gè)數(shù)據(jù)記錄的子集的動(dòng)作,其中該子集代表所選一組執(zhí)行路徑。這些和其他實(shí)施例每一個(gè)都可選地可以包括一種或多種如下特征。識(shí)別執(zhí)行路徑可以包括確定加入數(shù)據(jù)記錄中的一組流動(dòng)單元。該特征還可以包括識(shí)別多條路徑中不在執(zhí)行路徑中的未用路徑。該特征還可以包括使用數(shù)據(jù)流圖處理多個(gè)數(shù)據(jù)記錄的子集。處理多個(gè)數(shù)據(jù)記錄可以包括將第一流動(dòng)單元加入多個(gè)數(shù)據(jù)記錄中的數(shù)據(jù)記錄中。處理多個(gè)數(shù)據(jù)記錄可以包括將第二流動(dòng)單元加入該數(shù)據(jù)記錄中,以及將第一流動(dòng)單元加入第二流動(dòng)單元中。識(shí)別執(zhí)行路徑可以包括從使用所修改數(shù)據(jù)流圖處理的多個(gè)數(shù)據(jù)記錄中除去流動(dòng)單元,以及分析所除流動(dòng)單元以便為每個(gè)數(shù)據(jù)記錄確定執(zhí)行路徑。確定多個(gè)數(shù)據(jù)記錄的子集可以包括識(shí)別具有一條所選執(zhí)行路徑的數(shù)據(jù)記錄??梢詫?shí)現(xiàn)描述在本說(shuō)明書(shū)中的主題的特定實(shí)施例,以便獲得一種或多種如下好處??梢院?jiǎn)化數(shù)據(jù)流圖的調(diào)試??梢赃x擇使數(shù)據(jù)流圖得到充分鍛煉的數(shù)據(jù)記錄的樣本集合??梢噪S著各個(gè)記錄流過(guò)圖形跟蹤它們。在附圖和下面的描述中展示了描述在本說(shuō)明書(shū)中的主題的一個(gè)或多個(gè)實(shí)施例的細(xì)節(jié)。該主題的其他特征、方面、和好處可以從該描述、附圖、和權(quán)利要求書(shū)中明顯看出。附圖說(shuō)明圖1例示了通過(guò)數(shù)據(jù)流圖的執(zhí)行路徑;圖2例示了可以確定數(shù)據(jù)記錄的記錄譜系(lineage)的示范性環(huán)境;圖3例示了使用流動(dòng)單元跟蹤通過(guò)所修改數(shù)據(jù)流圖的記錄的例子;圖4例示了消耗流動(dòng)單元的例子;圖5例示了使用流動(dòng)單元跟蹤通過(guò)數(shù)據(jù)流圖的路徑的例子;圖6例示了識(shí)別導(dǎo)致輸出數(shù)據(jù)記錄的產(chǎn)生的輸入數(shù)據(jù)記錄的例子;圖7例示了修改數(shù)據(jù)流圖的數(shù)據(jù)源部件以便將流動(dòng)單元加入數(shù)據(jù)記錄中的例子;圖8例示了修改有多個(gè)輸出端口的部件以便將流動(dòng)單元加入數(shù)據(jù)記錄中的例子;圖9例示了修改數(shù)據(jù)宿以便處理流動(dòng)單元的例子;圖10例示了跨過(guò)多個(gè)數(shù)據(jù)流圖地使用流動(dòng)單元的例子;以及圖11例示了流動(dòng)分析的示范性過(guò)程。各種附圖中的相同標(biāo)號(hào)和名稱(chēng)指示相同元件。具體實(shí)施方式一般說(shuō)來(lái),流動(dòng)分析允許更全面地理解一組數(shù)據(jù)記錄內(nèi)值的分布、數(shù)據(jù)記錄之間的關(guān)系、和處理數(shù)據(jù)記錄以產(chǎn)生輸出記錄的方式。圖1例示了通過(guò)數(shù)據(jù)流圖的執(zhí)行路徑。數(shù)據(jù)流圖102包括可以從入口點(diǎn)104(例如,數(shù)據(jù)源)到出口點(diǎn)106,112(例如,數(shù)據(jù)宿)處理數(shù)據(jù)記錄的多條路徑,例如,路徑108和路徑110。在該例子中,路徑108從入口點(diǎn)104通到出口點(diǎn)106。路徑110從相同入口點(diǎn)104開(kāi)始但分支到出口點(diǎn)112。一般說(shuō)來(lái),數(shù)據(jù)流圖由一些部件和識(shí)別數(shù)據(jù)記錄在這些部件之間的流動(dòng)的鏈路組成。這些部件包括數(shù)據(jù)源、數(shù)據(jù)宿、和用于處理的部件。數(shù)據(jù)源可以提供進(jìn)入數(shù)據(jù)流圖的入口點(diǎn),以及可以讀取通過(guò)該圖形處理的一組數(shù)據(jù)記錄。例如,數(shù)據(jù)源可以包括關(guān)系數(shù)據(jù)庫(kù)中的表格或文件系統(tǒng)上的文件。數(shù)據(jù)源從表格或文件中讀取記錄并創(chuàng)建數(shù)據(jù)記錄。數(shù)據(jù)宿可以提供從數(shù)據(jù)流圖中出來(lái)的出口點(diǎn),以及一旦數(shù)據(jù)流圖完成了處理,就可以存儲(chǔ)輸出記錄。數(shù)據(jù)源和數(shù)據(jù)宿可以包括,例如,關(guān)系數(shù)據(jù)庫(kù)的表格或存儲(chǔ)在文件系統(tǒng)上的文件。數(shù)據(jù)流圖可以在計(jì)算機(jī)112或其他類(lèi)型的計(jì)算機(jī)設(shè)備上執(zhí)行。在其他實(shí)現(xiàn)中,數(shù)據(jù)流圖的執(zhí)行可以分配給多個(gè)計(jì)算設(shè)備。在一些實(shí)現(xiàn)中,這些部件可以包括輸入端口和輸出端口。這些鏈路將第一部件的輸出端口與第二部件的輸入端口連接。一些部件可以具有多個(gè)輸入和輸出端口。數(shù)據(jù)記錄可以從入口點(diǎn)航行到出口點(diǎn)的一系列部件和鏈路被稱(chēng)為路徑(例如,路徑108,110)。流動(dòng)分析是跟蹤數(shù)據(jù)記錄流過(guò)一個(gè)或多個(gè)數(shù)據(jù)流圖的過(guò)程。流動(dòng)分析使得可以在調(diào)試,測(cè)試和剖析(profiling)的領(lǐng)域中調(diào)試,測(cè)試和剖析一組新的應(yīng)用程序。對(duì)于調(diào)試,流動(dòng)分析使得可以在通過(guò)圖形處理各個(gè)數(shù)據(jù)記錄時(shí)跟蹤各個(gè)數(shù)據(jù)記錄。用戶(hù)可以標(biāo)記一個(gè)或多個(gè)記錄,或停止在斷點(diǎn)上,以及圖形開(kāi)發(fā)環(huán)境跟蹤指定記錄通過(guò)圖形的路徑,包括識(shí)別依賴(lài)于指定記錄的任何記錄和指定記錄所依賴(lài)的任何記錄。開(kāi)發(fā)者可以識(shí)別可能呈現(xiàn)難以預(yù)料結(jié)果的輸出數(shù)據(jù)記錄,觀看用于創(chuàng)建數(shù)據(jù)記錄的輸入數(shù)據(jù)記錄,以及跟蹤那些輸入數(shù)據(jù)記錄以確定數(shù)據(jù)流圖可能表現(xiàn)得出人意外的地方。對(duì)于測(cè)試,流動(dòng)分析使用戶(hù)能夠生成只包含通過(guò)特定路徑的記錄的輸入數(shù)據(jù)的子集。通過(guò)根據(jù)通過(guò)數(shù)據(jù)流圖的特定路徑選擇輸入數(shù)據(jù),可以保護(hù)所處理數(shù)據(jù)記錄的引用完整性。對(duì)于剖析,流動(dòng)分析使用戶(hù)能夠創(chuàng)建將記錄分類(lèi)成群的圖形,然后從這些類(lèi)別中的記錄所依賴(lài)的輸入數(shù)據(jù)集中生成記錄的子集。例如,一個(gè)圖形可以通過(guò)居住地和產(chǎn)品類(lèi)別將輸入的顧客和交易分成群,然后分解計(jì)算的輸出記錄據(jù)此落在“有利可圖”的輸出數(shù)據(jù)宿中還是落在“無(wú)利可圖”的輸出數(shù)據(jù)宿中的顧客和交易記錄。圖2例示了可以確定數(shù)據(jù)記錄的譜系的示范性環(huán)境。運(yùn)行在計(jì)算機(jī),例如,來(lái)自圖1的計(jì)算機(jī)112上的示范性系統(tǒng)200包括數(shù)據(jù)流圖中心庫(kù)202。如過(guò)程箭頭204所表示,數(shù)據(jù)流圖工具化引擎206從數(shù)據(jù)流圖中心庫(kù)202中獲取數(shù)據(jù)流圖。數(shù)據(jù)流圖工具化引擎206修改數(shù)據(jù)流圖,以便使數(shù)據(jù)流圖能夠隨著如下面所討論,通過(guò)修改的圖形處理數(shù)據(jù)記錄,跟蹤它們的記錄級(jí)譜系。數(shù)據(jù)流圖工具化引擎206可以是,例如,運(yùn)行在計(jì)算機(jī)上的進(jìn)程。在一些實(shí)現(xiàn)中,數(shù)據(jù)流圖工具化引擎206將使數(shù)據(jù)記錄能夠流過(guò)數(shù)據(jù)流圖以便加以跟蹤的處理部件加入數(shù)據(jù)流圖中。例如,附加處理部件可以將附加字段加入每個(gè)數(shù)據(jù)記錄中。這些附加字段可以稱(chēng)為流動(dòng)單元。在一些實(shí)現(xiàn)中,每個(gè)流動(dòng)單元標(biāo)識(shí)通過(guò)數(shù)據(jù)流圖的一段路徑。該流動(dòng)單元可以從數(shù)據(jù)記錄中除去和存儲(chǔ)起來(lái)供以后分析用。在一些實(shí)現(xiàn)中,數(shù)據(jù)流圖工具化引擎本身可以包括接受數(shù)據(jù)流圖作為輸入和產(chǎn)生修改的數(shù)據(jù)流圖的工具化數(shù)據(jù)流圖。如過(guò)程箭頭208所表示,可以將修改的數(shù)據(jù)流圖提供給數(shù)據(jù)流圖運(yùn)行時(shí)環(huán)境210,數(shù)據(jù)流圖運(yùn)行時(shí)環(huán)境210可以是運(yùn)行在一臺(tái)計(jì)算機(jī)或多臺(tái)計(jì)算機(jī)上的一個(gè)或多個(gè)進(jìn)程。如過(guò)程箭頭212所表示,將來(lái)自數(shù)據(jù)源214的數(shù)據(jù)記錄提供給數(shù)據(jù)流圖運(yùn)行時(shí)環(huán)境210。數(shù)據(jù)流圖運(yùn)行時(shí)環(huán)境210使用修改的數(shù)據(jù)流圖處理數(shù)據(jù)記錄。如過(guò)程箭頭216所表示,修改的數(shù)據(jù)流圖將流動(dòng)單元存儲(chǔ)在流動(dòng)單元中心庫(kù)218中。流動(dòng)單元中心庫(kù)218可以是,例如,關(guān)系數(shù)據(jù)庫(kù)或文件系統(tǒng)上的文件。如過(guò)程箭頭220所表示,流動(dòng)單元分析引擎222分析存儲(chǔ)的流動(dòng)單元。從存儲(chǔ)的流動(dòng)單元中,流動(dòng)單元分析引擎222隨著通過(guò)數(shù)據(jù)流圖得到處理,可以確定每個(gè)數(shù)據(jù)記錄走過(guò)的各種路徑。流動(dòng)單元分析引擎222可以確定至少一個(gè)數(shù)據(jù)記錄走過(guò)的通過(guò)數(shù)據(jù)流圖的所有不同路徑。流動(dòng)單元分析引擎222還可以確定記錄相關(guān)性。在一些情況下,輸出記錄依賴(lài)于多個(gè)輸入記錄。例如,數(shù)據(jù)流圖可以計(jì)算顧客在一年的過(guò)程中所下的訂單的總值。每個(gè)訂單代表一個(gè)單獨(dú)輸入記錄,這些記錄的總和產(chǎn)生單個(gè)輸出記錄。流動(dòng)單元分析引擎222可以確定用在輸出記錄的創(chuàng)建中的每個(gè)輸入數(shù)據(jù)記錄和每個(gè)中間數(shù)據(jù)。如過(guò)程箭頭224所表示,流動(dòng)單元分析引擎222可以存儲(chǔ)描述通過(guò)修改的數(shù)據(jù)流圖產(chǎn)生的數(shù)據(jù)記錄的數(shù)據(jù)概要222。如過(guò)程箭頭228所表示,流動(dòng)單元分析引擎222還可以接受來(lái)自數(shù)據(jù)源214的數(shù)據(jù)記錄。流動(dòng)單元分析引擎222可以使用流動(dòng)單元來(lái)確定數(shù)據(jù)記錄的代表性樣本。在一些實(shí)現(xiàn)中,代表性樣本是這樣確定的,使至少一個(gè)樣本數(shù)據(jù)及其處理后上代記錄在數(shù)據(jù)流圖中走過(guò)每條不同路徑。在一些實(shí)現(xiàn)中,代表性樣本是這樣確定的,使子集中的每個(gè)數(shù)據(jù)記錄走過(guò)相同路徑。流動(dòng)單元分析引擎222可以確定數(shù)據(jù)記錄的子集,以便通過(guò)數(shù)據(jù)流圖的記錄的子集的流動(dòng)覆蓋區(qū)與處理來(lái)自數(shù)據(jù)源214的數(shù)據(jù)記錄的整個(gè)集合時(shí)通過(guò)數(shù)據(jù)流圖產(chǎn)生的流動(dòng)覆蓋區(qū)相比保持一致。例如,數(shù)據(jù)流圖可以包括根據(jù)郵政編碼聚集交易記錄的數(shù)值的部件。當(dāng)選擇具有特定ZIP(郵政)編碼的記錄時(shí),流動(dòng)單元分析引擎222選擇與ZIP編碼相對(duì)應(yīng)的所有數(shù)據(jù)記錄。因此,無(wú)論處理數(shù)據(jù)記錄的子集還是處理數(shù)據(jù)源214中的所有數(shù)據(jù)記錄,那個(gè)郵政編碼的聚集值都保持一致。在一些實(shí)現(xiàn)中,流動(dòng)單元分析引擎222可以確定保持通過(guò)數(shù)據(jù)流圖的流動(dòng)覆蓋區(qū)的分布的數(shù)據(jù)子集。例如,如果在處理數(shù)據(jù)記錄的整個(gè)集合期間拒絕了10%的顧客,則當(dāng)處理數(shù)據(jù)記錄的子集時(shí),也將拒絕10%的顧客。如過(guò)程箭頭230所表示,流動(dòng)單元分析引擎222可以將數(shù)據(jù)記錄的子集存儲(chǔ)在樣本數(shù)據(jù)記錄中心庫(kù)232中。在一種實(shí)現(xiàn)中,暫停工具化數(shù)據(jù)流圖的執(zhí)行。在暫停狀態(tài)下,通過(guò)讓用戶(hù)首先選擇數(shù)據(jù)流圖中的部件來(lái)選擇一個(gè)部件中的數(shù)據(jù)記錄。系統(tǒng)200向用戶(hù)顯示在暫停狀態(tài)下停留在部件中的記錄集合,以便用戶(hù)接著可以二次選擇用于觀察的記錄。當(dāng)使用與所選記錄相聯(lián)系的流動(dòng)單元數(shù)據(jù)時(shí),系統(tǒng)200可以確定所有前記錄(輸入記錄、和圖形中直到包含所選記錄的部件的部件產(chǎn)生的那些中間記錄兩者)的集合。當(dāng)使用這個(gè)集合的輸入記錄時(shí),系統(tǒng)200現(xiàn)在可以創(chuàng)建一批只包含這些所選記錄的輸入數(shù)據(jù)子集,然后利用這些數(shù)據(jù)子集重新啟動(dòng)該圖形。該圖形現(xiàn)在可以逐步調(diào)試所選記錄的執(zhí)行,以便使用戶(hù)能夠觀察該圖形直到用戶(hù)首先選擇的部件的執(zhí)行的行為。圖3例示了使用流動(dòng)單元跟蹤通過(guò)所修改數(shù)據(jù)流圖的記錄的例子。數(shù)據(jù)源“ci”302包括兩個(gè)數(shù)據(jù)記錄,即,第一數(shù)據(jù)記錄330和第二數(shù)據(jù)記錄332。隨著數(shù)據(jù)記錄從數(shù)據(jù)源“ci”302提供給數(shù)據(jù)流圖,將流動(dòng)單元附在每個(gè)數(shù)據(jù)記錄上。將流動(dòng)單元304附在數(shù)據(jù)記錄330上,將流動(dòng)單元306附在數(shù)據(jù)記錄332上。在一些實(shí)現(xiàn)中,該流動(dòng)單元包括與該流動(dòng)單元相聯(lián)系的部件標(biāo)識(shí)符、與該部件相聯(lián)系的群、和序號(hào)。該群可以是,例如,提供數(shù)據(jù)記錄的端口的指示。在一些實(shí)現(xiàn)中,該流動(dòng)單元可以包括帶有部件標(biāo)識(shí)符、群標(biāo)識(shí)符、和序號(hào)的格式化字符串(例如,“ci.a.1”、“r1.a.1”)。每個(gè)部件標(biāo)識(shí)符能夠唯一地標(biāo)識(shí)數(shù)據(jù)流圖中的部件。例如,流動(dòng)單元304包括字符串“ci.a.1”,其中“ci”指示流動(dòng)單元與數(shù)據(jù)源“ci”302相聯(lián)系,群“a”指示在與字母“a”318相聯(lián)系的端口上提供數(shù)據(jù)記錄,以及序號(hào)“1”指示數(shù)據(jù)記錄是在與字母“a”318相聯(lián)系的端口上從數(shù)據(jù)源“ci”302提供的第一數(shù)據(jù)記錄。類(lèi)似地,流動(dòng)單元306包括字符串“ci.a.2”,其中“ci”指示流動(dòng)單元與數(shù)據(jù)源“ci”302相聯(lián)系,群“a”指示在與字母“a”318相聯(lián)系的端口上提供數(shù)據(jù)記錄,以及序號(hào)“2”指示數(shù)據(jù)記錄是在與字母“a”318相聯(lián)系的端口上從數(shù)據(jù)源“ci”302提供的第二數(shù)據(jù)記錄。在一些實(shí)現(xiàn)中,可以將部件和端口與數(shù)字、字母、字符串、或任何其他標(biāo)識(shí)符相聯(lián)系。在本例中,第一數(shù)據(jù)記錄330和第二數(shù)據(jù)記錄332兩者都由過(guò)濾部件“r1”308處理。過(guò)濾部件“r1”308在第一端口320上提供第一數(shù)據(jù)記錄330和在第一端口322上提供第一數(shù)據(jù)記錄332。將新流動(dòng)單元310提供給第一數(shù)據(jù)記錄330。該新流動(dòng)單元包括字符串“r1.a.1”,其中“r1”指示流動(dòng)單元與過(guò)濾部件“r1”308相聯(lián)系,“a”指示在“a”端口320上提供數(shù)據(jù)記錄,以及“1”指示數(shù)據(jù)記錄是在過(guò)濾部件“r1”308的“a”端口320上提供的第一數(shù)據(jù)記錄。過(guò)濾部件“r1”308處理在“b”端口322上提供第二數(shù)據(jù)記錄332。與第一數(shù)據(jù)記錄330類(lèi)似,將新流動(dòng)單元312提供給第二數(shù)據(jù)記錄。該新流動(dòng)單元312包括字符串“r1.b.1”,其中“r1”指示流動(dòng)單元與過(guò)濾部件“r1”308相聯(lián)系,“b”指示在“b”端口322上提供數(shù)據(jù)記錄,以及“1”指示數(shù)據(jù)記錄是在過(guò)濾部件“r1”308的“b”端口322上提供的第一數(shù)據(jù)記錄。不是每個(gè)部件都向數(shù)據(jù)記錄提供新流動(dòng)單元。在本例中,部件314、部件316、和部件334被認(rèn)為是通過(guò)部件。在流動(dòng)分析進(jìn)程中忽略這些部件。這里,第一數(shù)據(jù)記錄330保留它的流動(dòng)單元310,第二數(shù)據(jù)記錄332保留它的流動(dòng)單元312。在一些實(shí)現(xiàn)中,不變更數(shù)據(jù)記錄的路徑的部件不提供新流動(dòng)單元。在其他實(shí)現(xiàn)中,每個(gè)部件都向數(shù)據(jù)記錄提供新流動(dòng)單元。流動(dòng)工具化引擎可以有選擇地確定將圖形中的哪些部件工具化,以便構(gòu)建新流動(dòng)單元并對(duì)其指定黑色或群以反映已經(jīng)通過(guò)了特定部件和端口。在將數(shù)據(jù)記錄存儲(chǔ)在數(shù)據(jù)宿324中之前,除去流動(dòng)單元。將除去的流動(dòng)單元存儲(chǔ)在流動(dòng)單元數(shù)據(jù)存儲(chǔ)326中。在本例中,數(shù)據(jù)宿324存儲(chǔ)第一數(shù)據(jù)記錄330和第二數(shù)據(jù)記錄332。流動(dòng)單元數(shù)據(jù)存儲(chǔ)326存儲(chǔ)流動(dòng)單元312和流動(dòng)單元310。圖4例示了消耗流動(dòng)單元的例子。標(biāo)識(shí)部件、端口、和序號(hào)不一定足以唯一標(biāo)識(shí)通過(guò)數(shù)據(jù)流圖的整條路徑。為了標(biāo)識(shí)整條路徑,可以組合流動(dòng)單元。例如,參照?qǐng)D4,數(shù)據(jù)流圖包括部件“z1”402、部件“z2”404、和部件“r7”406。在本例中,數(shù)據(jù)記錄412是要通過(guò)部件“z1”402的“a”端口提供的第四數(shù)據(jù)記錄。將包括字符串“z1.a.4”的流動(dòng)單元410提供給數(shù)據(jù)記錄412。在數(shù)據(jù)記錄412經(jīng)過(guò)部件“r7”406處理之后,將新流動(dòng)單元414提供給該數(shù)據(jù)記錄。該新流動(dòng)單元指示該數(shù)據(jù)記錄是在部件“r7”406的“a”端口408上提供的第六數(shù)據(jù)記錄(“r7.a.6”)。在沒(méi)有更多的情況下,流動(dòng)單元414不指示數(shù)據(jù)記錄412由部件“z1”402提供還是由部件“z2”404提供。為了保留整條路徑,將流動(dòng)單元410并入流動(dòng)單元414中(或被流動(dòng)單元414消耗掉)。在一些實(shí)現(xiàn)中,流動(dòng)單元消耗以前與數(shù)據(jù)記錄或與經(jīng)過(guò)處理產(chǎn)生數(shù)據(jù)記錄的一個(gè)或多個(gè)數(shù)據(jù)記錄相聯(lián)系的一組其他流動(dòng)單元。在其他實(shí)現(xiàn)中,流動(dòng)單元保留對(duì)以前與數(shù)據(jù)記錄或處理后數(shù)據(jù)記錄相聯(lián)系的流動(dòng)單元的引用,或以前與數(shù)據(jù)記錄或處理后數(shù)據(jù)記錄相聯(lián)系的流動(dòng)單元的副本。隨著每個(gè)流動(dòng)單元被取代,將舊流動(dòng)單元存儲(chǔ)在流動(dòng)單元中心庫(kù)(例如,圖2的流動(dòng)單元中心庫(kù)218中)。新創(chuàng)建的流動(dòng)單元包含對(duì)存儲(chǔ)在流動(dòng)單元中心庫(kù)中的被取代流動(dòng)單元的引用。圖5例示了使用流動(dòng)單元跟蹤通過(guò)數(shù)據(jù)流圖的路徑的例子??梢詫⒘鲃?dòng)單元用于跟蹤通過(guò)數(shù)據(jù)流圖的復(fù)雜路徑。這些復(fù)雜流動(dòng)可以使用描述性字符串來(lái)描述,以便每個(gè)數(shù)據(jù)記錄及其沿著通過(guò)數(shù)據(jù)流圖的相同路徑的上代具有相同字符串。通過(guò)將已執(zhí)行流動(dòng)路徑的集合與通過(guò)數(shù)據(jù)流圖的所有可能流動(dòng)流徑的集合相比較,可以確定用于生成已執(zhí)行流動(dòng)路徑的集合的數(shù)據(jù)記錄是否足以測(cè)試數(shù)據(jù)流圖中的所有路徑(即,已執(zhí)行流動(dòng)路徑是否覆蓋所有可能流動(dòng)路徑)。將每個(gè)流動(dòng)單元與一個(gè)數(shù)據(jù)記錄相聯(lián)系,由于流動(dòng)單元還引用其他“消耗掉”流動(dòng)單元,所以可以標(biāo)識(shí)經(jīng)過(guò)處理產(chǎn)生每個(gè)流動(dòng)單元的記錄的整個(gè)集合。通過(guò)選擇所生成流動(dòng)單元的子集,可以選擇與所選流動(dòng)單元相對(duì)應(yīng)的數(shù)據(jù)記錄的子集。例如,可以將數(shù)據(jù)流圖500用于剖析顧客人口統(tǒng)計(jì)。在本例中,部件“ac”502提供代表一組顧客“a”的數(shù)據(jù)記錄流(簡(jiǎn)稱(chēng)為“a”顧客)。劃分部件“f1”504將數(shù)據(jù)記錄劃分成兩個(gè)集合,每個(gè)集合在不同輸出端口上提供。例如,劃分部件“f1”504根據(jù)ZIP編碼來(lái)劃分“a”顧客。部件“at”510提供代表“a”顧客完成的一組交易的流動(dòng)數(shù)據(jù)記錄(簡(jiǎn)稱(chēng)為“a”交易)。聯(lián)接部件512聯(lián)接顧客數(shù)據(jù)記錄和顧客交易產(chǎn)生“a”顧客的組合數(shù)據(jù)記錄流。不能與交易數(shù)據(jù)記錄聯(lián)接的顧客數(shù)據(jù)記錄和不能與顧客數(shù)據(jù)記錄聯(lián)接的交易數(shù)據(jù)記錄在通向出口點(diǎn)514的單獨(dú)輸出端口上提供。一般說(shuō)來(lái),將每個(gè)顧客交易數(shù)據(jù)記錄與完成交易的顧客相聯(lián)系。在本例中,顧客可以用來(lái)自劃分部件“f1”504的“a”端口的顧客數(shù)據(jù)記錄或來(lái)自劃分部件“f1”504的“b”端口的顧客數(shù)據(jù)記錄來(lái)表示,但不是兩者。部件“bc”516提供代表一組顧客“b”的數(shù)據(jù)記錄流(簡(jiǎn)稱(chēng)為“b”顧客)。劃分部件“f2”518將數(shù)據(jù)記錄劃分成兩個(gè)集合,每個(gè)集合在不同輸出端口上提供。例如,劃分部件“f2”518根據(jù)ZIP編碼來(lái)劃分“b”顧客。部件“bt”524提供代表“b”顧客完成的一組交易的流動(dòng)數(shù)據(jù)記錄(簡(jiǎn)稱(chēng)為“b”交易)。聯(lián)接部件“j2”526聯(lián)接“b”顧客數(shù)據(jù)記錄和“b”顧客交易產(chǎn)生“b”顧客的組合數(shù)據(jù)記錄流。不能與交易數(shù)據(jù)記錄聯(lián)接的顧客數(shù)據(jù)記錄和不能與顧客數(shù)據(jù)記錄聯(lián)接的交易數(shù)據(jù)記錄在通向出口點(diǎn)530的單獨(dú)輸出端口上提供。一般說(shuō)來(lái),將每個(gè)顧客交易數(shù)據(jù)記錄與完成交易的顧客相聯(lián)系。在本例中,顧客可以用來(lái)自劃分部件“f2”518的“a”端口的顧客數(shù)據(jù)記錄或來(lái)自劃分部件“f2”518的“b”端口的顧客數(shù)據(jù)記錄來(lái)表示,但不是兩者。部件“ci”532提供代表一般顧客信息的數(shù)據(jù)記錄流(簡(jiǎn)稱(chēng)為顧客信息)。部件“r1”534重新格式化提供顧客信息的數(shù)據(jù)記錄。不能重新格式化的數(shù)據(jù)記錄在通往出口點(diǎn)536的端口上提供。可以重新格式化的數(shù)據(jù)記錄在第二端口上提供。聯(lián)接部件“j3”538將重新格式化的顧客信息數(shù)據(jù)記錄與來(lái)自聯(lián)接部件“j1”512和數(shù)據(jù)記錄和來(lái)自聯(lián)接部件“j2”526的數(shù)據(jù)記錄組合。不能聯(lián)接的數(shù)據(jù)記錄在通往出口點(diǎn)540的輸出端口上提供。聯(lián)接的數(shù)據(jù)記錄在輸出端口上提供,流向匯總部件“ru”542。一般說(shuō)來(lái),部件“j3”538將重新格式化的顧客信息數(shù)據(jù)與來(lái)自劃分部件“j1”512的“a”端口的數(shù)據(jù)記錄或與來(lái)自劃分部件“j2”526的“a”端口的數(shù)據(jù)記錄組合。匯總部件“ru”542根據(jù)一些準(zhǔn)則,例如,根據(jù)郵政編碼來(lái)聚集顧客交易記錄。聚集的記錄在通向出口點(diǎn)544的端口上提供。將數(shù)據(jù)流圖500修改成使用流動(dòng)單元來(lái)跟蹤數(shù)據(jù)記錄的流動(dòng)。例如,使用數(shù)據(jù)流圖工具化引擎(例如,顯示在圖2中的數(shù)據(jù)流圖工具化引擎206)。當(dāng)使用字符串表示時(shí),流動(dòng)單元可以與可以組合起來(lái)描述流動(dòng)的各個(gè)數(shù)據(jù)記錄無(wú)關(guān)地描述數(shù)據(jù)記錄通過(guò)數(shù)據(jù)流圖的復(fù)雜流動(dòng)。例如,由部件“ac”提供的數(shù)據(jù)記錄可以用指示數(shù)據(jù)記錄源自部件“ac”502的“a”端口的流動(dòng)單元字符串“ac.a”來(lái)標(biāo)記。一旦過(guò)濾部件“f1”504過(guò)濾了數(shù)據(jù)記錄,就可以用指示數(shù)據(jù)記錄是在過(guò)濾部件“f1”504的“b”端口上提供的流動(dòng)單元字符串“f1.b”標(biāo)記數(shù)據(jù)記錄。在一些實(shí)現(xiàn)中,流動(dòng)單元可以包括標(biāo)識(shí)數(shù)據(jù)記錄走過(guò)的路徑的每個(gè)部分的歷史字符串。例如,可以用歷史字符串“(ac.a)f1.b”標(biāo)記數(shù)據(jù)記錄。括號(hào)可以用于指示f1.b流動(dòng)單元消耗了ac.a流動(dòng)單元。類(lèi)似地,部件“at”510提供的數(shù)據(jù)記錄用帶有指示數(shù)據(jù)記錄是在部件“at”510的端口上提供的歷史字符串“at.a”的流動(dòng)單元來(lái)標(biāo)記。聯(lián)接部件“j1”512將來(lái)自過(guò)濾部件“f1”504的一個(gè)顧客數(shù)據(jù)記錄與來(lái)自部件“at”510的交易記錄組合。組合的數(shù)據(jù)記錄可以用帶有歷史字符串“((ac.a)f1.b,at.a)j1.a”的流動(dòng)單元來(lái)標(biāo)記,歷史字符串“((ac.a)f1.b,at.a)j1.a”指示通過(guò)組合來(lái)自顧客記錄的流動(dòng)單元(“(ac.a)f1.b”)和來(lái)自交易記錄的流動(dòng)單元(“at.a”)創(chuàng)建了新的流動(dòng)單元。逗號(hào)可以用于隔開(kāi)組合在一起的多個(gè)流動(dòng)單元。類(lèi)似地,顧客信息數(shù)據(jù)記錄由部件“ci”532提供,并用具有歷史字符串“ci.a”的流動(dòng)單元來(lái)標(biāo)記。顧客信息數(shù)據(jù)記錄由部件“r1”534重新格式化。重新格式化的顧客信息數(shù)據(jù)記錄用具有歷史字符串“(ci.a)r1.a”的流動(dòng)單元來(lái)標(biāo)記。聯(lián)接部件“j3”538組合來(lái)自聯(lián)接部件“j1”512的組合數(shù)據(jù)記錄和來(lái)自部件“r1”534的重新格式化顧客信息數(shù)據(jù)記錄。新組合記錄可以用具有歷史字符串“(((ac.a)f1.b,at.a)j1.a,(ci.a)r1.a)j3.a”的流動(dòng)單元來(lái)標(biāo)記。匯總部件“ru”542將源自聯(lián)接部件“j3”538的多個(gè)記錄組合成單個(gè)記錄。歷史字段中的星號(hào)“*”可以用于指示將來(lái)自相同流的多個(gè)記錄組合在一起。例如,匯總記錄可以用帶有歷史字符串“(*(((ac.a)f1.b,at.a)j1.a,(ci.a)r1.a)j3.a)ru.a”的流動(dòng)單元來(lái)標(biāo)記。這個(gè)記號(hào)指示在產(chǎn)生ru.a流動(dòng)單元時(shí)消耗了多個(gè)“(((ac.a)f1.b,at.a)j1.a,(ci.a)r1.a)j3.a”流動(dòng)單元。圖6例示了識(shí)別導(dǎo)致輸出數(shù)據(jù)記錄的產(chǎn)生的輸入數(shù)據(jù)記錄的例子。一旦確定了所有執(zhí)行流動(dòng)路徑歷史,就可以將流動(dòng)路徑歷史用于確定在所有或一些執(zhí)行流動(dòng)路徑上提供全部或部分覆蓋區(qū)的數(shù)據(jù)子集。例如,存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中的表格602包括從圖5的數(shù)據(jù)流圖500中產(chǎn)生的所有數(shù)據(jù)記錄的執(zhí)行流動(dòng)路徑。表格602的每一行對(duì)應(yīng)于數(shù)據(jù)流圖產(chǎn)生的輸出數(shù)據(jù)記錄。表格的一列包括描述取來(lái)產(chǎn)生輸出記錄的執(zhí)行路徑的流動(dòng)單元?dú)v史。從輸出記錄中可以確定輸入記錄。每個(gè)輸出記錄對(duì)應(yīng)于包括如上面參照?qǐng)D4所述的嵌套流動(dòng)單元的流動(dòng)單元。例如,如箭頭606所表示,行604包含流動(dòng)單元608的表示。流動(dòng)單元608包括在創(chuàng)建流動(dòng)單元時(shí)消耗的所有流動(dòng)單元。產(chǎn)生與行604相對(duì)應(yīng)的輸出數(shù)據(jù)記錄所需的輸入數(shù)據(jù)記錄可以通過(guò)檢查流動(dòng)單元樹(shù)的“葉節(jié)點(diǎn)”來(lái)確定。那是在創(chuàng)建它們時(shí)未消耗任何其他流動(dòng)單元的流動(dòng)單元。在本例中,嵌套流動(dòng)單元610指示在創(chuàng)建輸出數(shù)據(jù)記錄時(shí)使用了在部件“ci”的“a”端口上提供的第10數(shù)據(jù)記錄。由于部件“ci”只包含單個(gè)端口(參見(jiàn)圖5的部件“ci”532),所以可以唯一地標(biāo)識(shí)輸入數(shù)據(jù)記錄。類(lèi)似地,嵌套流動(dòng)單元612,614,616,618和620指示在創(chuàng)建輸出數(shù)據(jù)記錄時(shí)分別使用了在部件“at”的“a”端口上提供的第8數(shù)據(jù)記錄、在部件“ac”的“a”端口上提供的第10數(shù)據(jù)記錄、在部件“ci”的“a”端口上提供的第19數(shù)據(jù)記錄、在部件“at”的“a”端口上提供的第21數(shù)據(jù)記錄、和在部件“ac”的“a”端口上提供的第30數(shù)據(jù)記錄。包括這些記錄的數(shù)據(jù)的樣本集合產(chǎn)生與表格602的行604相對(duì)應(yīng)的輸出數(shù)據(jù)記錄。通過(guò)使用與輸出數(shù)據(jù)記錄的所選子集相聯(lián)系的流動(dòng)單元?dú)v史,可以選擇產(chǎn)生這些輸出記錄的輸入數(shù)據(jù)記錄的子集。輸入數(shù)據(jù)記錄的這個(gè)子集可以不變更程序的行為地用于測(cè)試或分析。例如。如果測(cè)試集合未包括在部件“at”的“a”端口上提供的第21數(shù)據(jù)記錄,則該圖形的執(zhí)行將不產(chǎn)生相同輸出記錄。圖7例示了修改數(shù)據(jù)流圖的數(shù)據(jù)源部件以便將流動(dòng)單元加入數(shù)據(jù)記錄中的例子。一般說(shuō)來(lái),數(shù)據(jù)流圖可以被工具化成將流動(dòng)單元加入數(shù)據(jù)記錄中,將流動(dòng)單元組合在一起提供到數(shù)據(jù)流圖的執(zhí)行路徑的地圖,以及在數(shù)據(jù)記錄從數(shù)據(jù)流圖中退出之前除去流動(dòng)單元。修改數(shù)據(jù)流圖700提供記錄譜系可以包括將重新格式化每個(gè)數(shù)據(jù)記錄以包括流動(dòng)單元的部件加在每個(gè)數(shù)據(jù)源的后面。在一些實(shí)現(xiàn)中,用包含原始輸入數(shù)據(jù)集合部件的副本和重新格式化每個(gè)數(shù)據(jù)記錄以包括流動(dòng)單元的部件的子圖(或嵌套圖)取代每個(gè)數(shù)據(jù)源。例如,將數(shù)據(jù)流圖700修改成數(shù)據(jù)源702將數(shù)據(jù)記錄提供給流動(dòng)單元生成器部件704。在一些實(shí)現(xiàn)中,流動(dòng)單元生成器部件704將附加字段加入每個(gè)數(shù)據(jù)記錄中,該附加字段是如上所述的流動(dòng)單元。圖8例示了修改有多個(gè)輸出端口的部件以便將流動(dòng)單元加入數(shù)據(jù)記錄中的例子。數(shù)據(jù)流圖700包括具有多個(gè)輸出端口804,806的重新格式化部件802。在本例中,為每個(gè)端口加入單獨(dú)流動(dòng)單元生成器。端口804對(duì)應(yīng)于流動(dòng)單元生成器808,端口806對(duì)應(yīng)于流動(dòng)單元生成器810。在一些實(shí)現(xiàn)中,用子圖取代帶有多個(gè)輸出端口的部件。例如,子圖812包含原始部件的副本,以及在每個(gè)端口上將流動(dòng)單元提供給數(shù)據(jù)記錄。圖9例示了修改數(shù)據(jù)宿以便處理流動(dòng)單元的例子。數(shù)據(jù)流圖被修改成加入了流動(dòng)單元除去部件904。流動(dòng)單元除去部件904從數(shù)據(jù)記錄中除去流動(dòng)單元,并將其存儲(chǔ)在流動(dòng)單元中心庫(kù)906中。將沒(méi)有流動(dòng)單元的數(shù)據(jù)記錄存儲(chǔ)在數(shù)據(jù)宿902中。圖10例示了跨過(guò)多個(gè)數(shù)據(jù)流圖地使用流動(dòng)單元的例子。例如,工具化數(shù)據(jù)流圖A1004從數(shù)據(jù)存儲(chǔ)1002中讀取數(shù)據(jù)記錄。如過(guò)程箭頭1006所表示,數(shù)據(jù)流圖A1004處理該記錄并產(chǎn)生到數(shù)據(jù)存儲(chǔ)1008的輸出數(shù)據(jù)記錄。如過(guò)程箭頭1012所表示,將數(shù)據(jù)流圖A1004產(chǎn)生的每個(gè)輸出數(shù)據(jù)記錄與存儲(chǔ)在流動(dòng)單元中心庫(kù)1010中的流動(dòng)單元相聯(lián)系。如過(guò)程箭頭1016所表示,工具化數(shù)據(jù)流圖B從數(shù)據(jù)存儲(chǔ)1008中讀取數(shù)據(jù)記錄,處理該記錄,并將它們存儲(chǔ)在數(shù)據(jù)存儲(chǔ)1020中。如過(guò)程箭頭1014所表示,取代為從數(shù)據(jù)存儲(chǔ)1008中讀取的每個(gè)數(shù)據(jù)記錄創(chuàng)建新流動(dòng)單元,工具化數(shù)據(jù)流圖B1018從流動(dòng)單元中心庫(kù)1010中讀取與數(shù)據(jù)記錄相聯(lián)系的流動(dòng)單元。如過(guò)程箭頭1022所表示,工具化數(shù)據(jù)流圖將流動(dòng)單元存儲(chǔ)在流動(dòng)單元中心庫(kù)1010中。從工具化數(shù)據(jù)流圖B1018中產(chǎn)生的流動(dòng)單元包括消耗的流動(dòng)單元和標(biāo)識(shí)通過(guò)數(shù)據(jù)流圖A1004和數(shù)據(jù)流圖B1018兩者的數(shù)據(jù)記錄及其上代數(shù)據(jù)記錄的全部執(zhí)行路徑的歷史。圖11例示了流動(dòng)分析的示范性過(guò)程。該過(guò)程可以在一臺(tái)或多臺(tái)計(jì)算設(shè)備,例如,圖1的計(jì)算機(jī)112上實(shí)現(xiàn)。過(guò)程1100修改(1102)數(shù)據(jù)流圖。該數(shù)據(jù)流圖被修改成加入和從通過(guò)數(shù)據(jù)流圖處理的數(shù)據(jù)記錄中除去流動(dòng)單元。每個(gè)流動(dòng)單元標(biāo)識(shí)通過(guò)數(shù)據(jù)流圖的一段路徑。過(guò)程1100根據(jù)流動(dòng)單元識(shí)別(1104)執(zhí)行路徑。該流動(dòng)單元可以用于識(shí)別一個(gè)數(shù)據(jù)記錄和用于產(chǎn)生它的前記錄走過(guò)的通過(guò)數(shù)據(jù)流圖的路徑。過(guò)程1100確定(1106)數(shù)據(jù)記錄的子集。該數(shù)據(jù)記錄的子集根據(jù)執(zhí)行路徑來(lái)確定,以便該子集中的至少一個(gè)數(shù)據(jù)記錄走過(guò)通過(guò)數(shù)據(jù)流圖的每條執(zhí)行路徑。描述在本說(shuō)明書(shū)中的主題的實(shí)施例和操作可以在數(shù)字電路中,或在包括公開(kāi)在本說(shuō)明書(shū)中的結(jié)構(gòu)和它們的結(jié)構(gòu)等效物的計(jì)算機(jī)軟件、固件或硬件中,或在它們的兩種或更多種的組合體中實(shí)現(xiàn)。描述在本說(shuō)明書(shū)中的主題的實(shí)施例可以實(shí)現(xiàn)成編碼在計(jì)算機(jī)存儲(chǔ)介質(zhì)上供數(shù)據(jù)處理裝置執(zhí)行或控制數(shù)據(jù)處理裝置的操作的一個(gè)或多個(gè)計(jì)算機(jī)程序,即,計(jì)算機(jī)程序指令的一個(gè)或多個(gè)模塊??商娲?,或另外,可以將程序指令編碼在人工生成傳播信號(hào),例如,為編碼信息而生成,發(fā)送給適當(dāng)接收裝置的機(jī)器生成電、光、或電磁信號(hào)上以便供數(shù)據(jù)處理裝置執(zhí)行。計(jì)算機(jī)存儲(chǔ)介質(zhì)可以是計(jì)算機(jī)可讀存儲(chǔ)設(shè)備、計(jì)算機(jī)可讀存儲(chǔ)基片、隨機(jī)或串行訪(fǎng)問(wèn)存儲(chǔ)陣列或設(shè)備、或它們的兩種或更多種的組合體,或包括在它們當(dāng)中。此外,雖然計(jì)算機(jī)存儲(chǔ)介質(zhì)不是傳播信號(hào),但計(jì)算機(jī)存儲(chǔ)介質(zhì)可以是編碼在人工生成傳播信號(hào)中的計(jì)算機(jī)程序指令的源頭或目的地。計(jì)算機(jī)存儲(chǔ)介質(zhì)還可以是一個(gè)或多個(gè)單獨(dú)物理部件或介質(zhì)(例如,多個(gè)CD、盤(pán)、或其他存儲(chǔ)設(shè)備),或包括在它們當(dāng)中。描述在本說(shuō)明書(shū)中的操作可以實(shí)現(xiàn)成由數(shù)據(jù)處理裝置對(duì)存儲(chǔ)在一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)設(shè)備上或從其他源頭接收的數(shù)據(jù)進(jìn)行的操作。術(shù)語(yǔ)“數(shù)據(jù)處理裝置”包含處理數(shù)據(jù)的所有類(lèi)型裝置、設(shè)備、和機(jī)器,舉例來(lái)說(shuō),包括可編程處理器、計(jì)算機(jī)、芯片上的系統(tǒng)、或上述的多個(gè)或組合體。該裝置可以包括專(zhuān)用邏輯電路,例如,F(xiàn)PGA(現(xiàn)場(chǎng)可編程門(mén)陣列)或ASIC(專(zhuān)用集成電路)。除了硬件之外,該裝置還可以包括為所涉及的計(jì)算機(jī)程序創(chuàng)造執(zhí)行環(huán)境的代碼,例如,構(gòu)建處理器固件、協(xié)議棧、數(shù)據(jù)庫(kù)管理系統(tǒng)、操作系統(tǒng)、跨平臺(tái)運(yùn)行時(shí)環(huán)境、虛擬機(jī)、或它們的兩種或更多種組合體的代碼。該裝置和執(zhí)行環(huán)境可以實(shí)現(xiàn)像萬(wàn)維網(wǎng)服務(wù)、分布式計(jì)算和網(wǎng)格計(jì)算基礎(chǔ)設(shè)施那樣的各種不同計(jì)算模型基礎(chǔ)設(shè)施。計(jì)算機(jī)程序(也稱(chēng)為程序、軟件、應(yīng)用軟件、腳本、或代碼)可以用包括編譯或解釋語(yǔ)言、或說(shuō)明或過(guò)程語(yǔ)言的任何形式編程語(yǔ)言來(lái)編寫(xiě),并且可以以包括部件、子例程、對(duì)象、或適合用在計(jì)算環(huán)境中的其他單元作為獨(dú)立程序或作為模塊的任何形式部署。計(jì)算機(jī)程序可以,但無(wú)需,對(duì)應(yīng)于文件系統(tǒng)中的文件??梢詫⒊绦虼鎯?chǔ)在保存其他程序或數(shù)據(jù)(例如,存儲(chǔ)在標(biāo)記語(yǔ)言文檔中的一個(gè)或多個(gè)腳本)的文件的一部分中,存儲(chǔ)在專(zhuān)用于所涉及的程序的單個(gè)文件中,或存儲(chǔ)在多個(gè)協(xié)作文件(例如,存儲(chǔ)一個(gè)或多個(gè)模塊、子程序和部分代碼的文件)中??梢詫⒂?jì)算機(jī)程序部署成在單臺(tái)計(jì)算機(jī)上或在位于單個(gè)地點(diǎn)或分布在多個(gè)地點(diǎn)上和通過(guò)通信網(wǎng)絡(luò)互連的多臺(tái)計(jì)算機(jī)上執(zhí)行。描述在本說(shuō)明書(shū)中的進(jìn)程和邏輯流程可以由執(zhí)行一個(gè)或多個(gè)計(jì)算機(jī)程序以便通過(guò)操作輸入數(shù)據(jù)和生成輸出來(lái)執(zhí)行動(dòng)作的一臺(tái)或多臺(tái)可編程處理器來(lái)執(zhí)行。該進(jìn)程和邏輯流程也可以由專(zhuān)用邏輯電路,例如,F(xiàn)PGA(現(xiàn)場(chǎng)可編程門(mén)陣列)、或ASIC(專(zhuān)用集成電路)來(lái)執(zhí)行,以及也可以將裝置實(shí)現(xiàn)成專(zhuān)用邏輯電路,例如,F(xiàn)PGA(現(xiàn)場(chǎng)可編程門(mén)陣列)、或ASIC(專(zhuān)用集成電路)。舉例來(lái)說(shuō),適合執(zhí)行計(jì)算機(jī)程序的處理器包括通用和專(zhuān)用微處理器兩者、和任何類(lèi)型數(shù)字計(jì)算機(jī)的任何一個(gè)或多個(gè)處理器。一般說(shuō)來(lái),處理器從只讀存儲(chǔ)器或隨機(jī)訪(fǎng)問(wèn)存儲(chǔ)器或兩者接收指令和數(shù)據(jù)。計(jì)算機(jī)的基本元件是依照指令執(zhí)行動(dòng)作的處理器、和存儲(chǔ)指令和數(shù)據(jù)的一個(gè)或多個(gè)存儲(chǔ)設(shè)備。一般說(shuō)來(lái),計(jì)算機(jī)還包括存儲(chǔ)數(shù)據(jù)的一個(gè)或多個(gè)海量存儲(chǔ)設(shè)備,例如,磁盤(pán)、磁光盤(pán)、或光盤(pán),或可操作地耦合成從它們那里接收數(shù)據(jù)或?qū)?shù)據(jù)傳送給它們,或兩者。但是,計(jì)算機(jī)無(wú)需含有這樣的設(shè)備。此外,可以將計(jì)算機(jī)嵌入另一個(gè)設(shè)備,例如,移動(dòng)電話(huà)、個(gè)人數(shù)字助理(PDA)、移動(dòng)音頻或視頻播放器、游戲機(jī)、全球定位系統(tǒng)(GPS)接收器、或便攜式存儲(chǔ)設(shè)備(例如,通用串行總線(xiàn)(USB)閃存驅(qū)動(dòng)器)等中。適合存儲(chǔ)計(jì)算機(jī)程序指令和數(shù)據(jù)的設(shè)備包括所有形式的非易失性存儲(chǔ)器、介質(zhì)和存儲(chǔ)設(shè)備,舉例來(lái)說(shuō),包括半導(dǎo)體存儲(chǔ)設(shè)備,例如,可擦除可編程只讀存儲(chǔ)器(EPROM)、電可擦除可編程只讀存儲(chǔ)器(EEPROM)、和閃速存儲(chǔ)設(shè)備;磁盤(pán),例如,內(nèi)部硬盤(pán)或可換式盤(pán);磁光盤(pán);以及CD-ROM、和DVD-ROM盤(pán)。處理器和存儲(chǔ)器可以通過(guò)專(zhuān)用邏輯電路來(lái)補(bǔ)充,或并入專(zhuān)用邏輯電路中。為了提供與用戶(hù)的交互,描述在本說(shuō)明書(shū)中的主題的實(shí)施例可以在含有向用戶(hù)顯示信息的顯示設(shè)備,例如,CRT(陰極射線(xiàn)管)、或LCD(液晶顯示器)監(jiān)視器以及用戶(hù)可以向計(jì)算機(jī)提供輸入的鍵盤(pán)和定位設(shè)備,例如,鼠標(biāo)或跟蹤的計(jì)算機(jī)上實(shí)現(xiàn)。也可以將其他類(lèi)型的設(shè)備用于提供與用戶(hù)的交互;例如,提供給用戶(hù)的反饋可以是任何形式的感覺(jué)反饋,例如,視覺(jué)反饋、聽(tīng)覺(jué)反饋或觸覺(jué)反饋;以及來(lái)自用戶(hù)的輸入可以以任何形式接收,包括聲音、語(yǔ)音或觸覺(jué)輸入。另外,計(jì)算機(jī)可以通過(guò)將文檔發(fā)送給用戶(hù)使用的設(shè)備或從用戶(hù)使用的設(shè)備接收文檔,例如,通過(guò)響應(yīng)從萬(wàn)維網(wǎng)瀏覽器接收的請(qǐng)求,將網(wǎng)頁(yè)發(fā)送給用戶(hù)客戶(hù)設(shè)備上的萬(wàn)維網(wǎng)瀏覽器與用戶(hù)交互。描述在本說(shuō)明書(shū)中的主題的實(shí)施例可以在包括后端部件,例如,作為數(shù)據(jù)服務(wù)器,包括中間部件,例如,應(yīng)用服務(wù)器,包括前端部件,例如,具有用戶(hù)可以與描述在本說(shuō)明書(shū)中的主題的實(shí)現(xiàn)交互的圖形用戶(hù)界面或萬(wàn)維網(wǎng)瀏覽器的客戶(hù)計(jì)算機(jī),或包括兩個(gè)或更多個(gè)這樣的后端、中間、或前端部件的任何組合體的計(jì)算系統(tǒng)中實(shí)現(xiàn)。系統(tǒng)的部件可以通過(guò)數(shù)字?jǐn)?shù)據(jù)通信的任何形式或介質(zhì),例如,通信網(wǎng)絡(luò)互連。通信網(wǎng)絡(luò)的例子包括局域網(wǎng)(LAN)、廣域網(wǎng)(WAN)、互聯(lián)網(wǎng)(例如,因特網(wǎng))、和對(duì)等網(wǎng)絡(luò)(例如,對(duì)點(diǎn)對(duì)對(duì)等網(wǎng)絡(luò))。計(jì)算系統(tǒng)可以包括客戶(hù)機(jī)和服務(wù)器。客戶(hù)機(jī)和服務(wù)器一般相互遠(yuǎn)離,通常通過(guò)通信網(wǎng)絡(luò)交互??蛻?hù)機(jī)和服務(wù)器的關(guān)系通過(guò)運(yùn)行在各自計(jì)算機(jī)上和相互具有客戶(hù)機(jī)-服務(wù)器關(guān)系的計(jì)算機(jī)程序建立起來(lái)。在一些實(shí)施例中,服務(wù)器將數(shù)據(jù)(例如,HTML頁(yè)面)發(fā)送給客戶(hù)設(shè)備(例如,為了向與客戶(hù)設(shè)備交互的用戶(hù)顯示數(shù)據(jù)和從該用戶(hù)接收用戶(hù)輸入的目的)??梢栽诜?wù)器上從客戶(hù)設(shè)備接收在客戶(hù)設(shè)備上生成的數(shù)據(jù)(例如,用戶(hù)交互的結(jié)果)。雖然本說(shuō)明書(shū)包含許多具體實(shí)現(xiàn)細(xì)節(jié),但這些不應(yīng)該被理解為限制任何發(fā)明的范圍或可能要求保護(hù)的范圍,而是作為對(duì)特定發(fā)明的特定實(shí)施例特有的特征的描述。在單獨(dú)實(shí)施例的背景下描述在本說(shuō)明書(shū)中的某些特征也可以在單個(gè)實(shí)施例中以組合形式實(shí)現(xiàn)。相反,在單個(gè)實(shí)施例的背景下描述的各種特征也可以在多個(gè)實(shí)施例中單獨(dú)地或以任何適當(dāng)分組合的形式實(shí)現(xiàn)。此外,盡管上面可能將一些特征描述成以某種組合形式起作用和甚至最初要求這樣,但所要求組合當(dāng)中的一種或多種特征在一些情況下可以從該組合中分割出來(lái),以及所要求組合可以針對(duì)分組合或分組合的變種。類(lèi)似地,雖然在附圖中按特定次序描述這些操作,但不應(yīng)該理解為要求按所示的特定次序或順序地執(zhí)行這樣的操作,或執(zhí)行所有例示的操作來(lái)獲得所希望的結(jié)果。在某些情況下,多任務(wù)和并行處理可能是有利的。此外,在上述的實(shí)施例中各種系統(tǒng)部件的分離不應(yīng)該理解為在所有實(shí)施例中都要求這樣的分離,而應(yīng)該理解為所述程序部件和系統(tǒng)一般可以一起合并在單個(gè)軟件產(chǎn)品中或打包成多個(gè)軟件產(chǎn)品。因此,我們已經(jīng)描述了主題的特定實(shí)施例。其他實(shí)施例在所附權(quán)利要求書(shū)的范圍之內(nèi)。在一些情況下,列舉在權(quán)利要求書(shū)中的動(dòng)作可以按不同次序執(zhí)行,但仍然可以獲得所希望的結(jié)果。另外,描述在附圖中的過(guò)程未必要求所示的特定次序或順序來(lái)獲得所希望的結(jié)果。在某些實(shí)現(xiàn)中,多任務(wù)和并行處理可能是有利的。上述的流動(dòng)分析手段可以使用運(yùn)行在計(jì)算機(jī)上的軟件來(lái)實(shí)現(xiàn)。例如,該軟件形成運(yùn)行在一個(gè)或多個(gè)編程或可編程計(jì)算機(jī)系統(tǒng)(可以具有像分布式、客戶(hù)機(jī)/服務(wù)器、或網(wǎng)格那樣的各種架構(gòu))上的一個(gè)或多個(gè)計(jì)算機(jī)程序中的過(guò)程,每個(gè)編程或可編程計(jì)算機(jī)系統(tǒng)包括至少一個(gè)處理器、至少一個(gè)數(shù)據(jù)存儲(chǔ)系統(tǒng)(包括易失性和非易失性存儲(chǔ)器和/或存儲(chǔ)元件)、至少一個(gè)輸入設(shè)備或端口、和至少一個(gè)輸出設(shè)備或端口。該軟件可以形成,例如,提供與數(shù)據(jù)流圖的設(shè)計(jì)和配置有關(guān)的其他服務(wù)的較大程序的一個(gè)或多個(gè)模塊。該圖形的節(jié)點(diǎn)和元件可以實(shí)現(xiàn)成存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)中的數(shù)據(jù)結(jié)構(gòu)或遵從存儲(chǔ)在數(shù)據(jù)中心庫(kù)中的數(shù)據(jù)模型的其他有組織數(shù)據(jù)。軟件可以在像CD-ROM那樣,通用或?qū)S每删幊逃?jì)算機(jī)可讀的存儲(chǔ)介質(zhì)上提供,或在網(wǎng)絡(luò)的通信介質(zhì)上輸送(編碼在傳播信號(hào)中)給執(zhí)行它的計(jì)算機(jī)的存儲(chǔ)介質(zhì)。所有功能都可以在專(zhuān)用計(jì)算機(jī)上執(zhí)行,或使用像協(xié)處理器那樣的專(zhuān)用硬件來(lái)執(zhí)行。軟件可以實(shí)現(xiàn)成不同計(jì)算機(jī)執(zhí)行軟件規(guī)定的計(jì)算的不同部分的分布式。每個(gè)這樣的計(jì)算機(jī)程序優(yōu)選地存儲(chǔ)在通用或?qū)S每删幊逃?jì)算機(jī)可讀的存儲(chǔ)介質(zhì)或設(shè)備(例如,固態(tài)存儲(chǔ)器或介質(zhì)、或磁或光介質(zhì))上,或下載到這樣的存儲(chǔ)介質(zhì)或設(shè)備,以便當(dāng)計(jì)算機(jī)系統(tǒng)讀取該存儲(chǔ)介質(zhì)或設(shè)備執(zhí)行描述在其中的過(guò)程時(shí)配置和操作計(jì)算機(jī)。本發(fā)明系統(tǒng)也可以被認(rèn)為實(shí)現(xiàn)成配有計(jì)算機(jī)程序的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其中如此配置的存儲(chǔ)介質(zhì)使計(jì)算機(jī)系統(tǒng)以特定和預(yù)定方式操作,以執(zhí)行描述在其中的功能。上面已經(jīng)描述了本發(fā)明的許多實(shí)施例。不過(guò),應(yīng)該明白,可以不偏離本發(fā)明的精神和范圍地作出各種修改。例如,上述的一些步驟可以是與次序無(wú)關(guān)的,因此可以按與所述不同的次序執(zhí)行。要明白的是,前面的描述旨在例示本發(fā)明而不是限制本發(fā)明的范圍,本發(fā)明的范圍由所附權(quán)利要求書(shū)的范圍限定。例如,上述的許多功能步驟可以基本上不影響整個(gè)處理地按不同次序執(zhí)行。其他實(shí)施例在所附權(quán)利要求的范圍之內(nèi)。