(57)【特許請求の範囲】
【請求項１】
メッセージを使用してデータを処理するためのコンピュータシステムであって、
複数の独立非同期処理ノードを備え、前記処理ノードは、１つ以上のコンピュータ上で稼動する１つ以上のコンピュータプログラムを備え、前記処理ノードは、有向グラフによって表される態様で相互接続されており、
前記複数の処理ノードは、メッセージのグループを出力するように構成されている第１のノードを含み、
前記複数の処理ノードは、前記第１のノードによって出力されたメッセージのグループ内のメッセージを順番に処理するように構成されている第２のノードを含み、
前記第２のノードは、
メッセージのグループ内のメッセージを記憶するためのメモリ内のバッファと、
他のメッセージを記憶するためのメモリ内の入力待ち行列と、
バッファマネージャと
を備え、前記バッファマネージャは、
入力メッセージがメッセージのグループ内にあるかどうかを検出することと、
前記メッセージがメッセージのグループ内にある場合、前記メッセージが親ノードであるかどうか決定することと、
前記メッセージが親ノードではない場合、前記メッセージを前記バッファに置くことと、
前記メッセージが親ノードである場合、子ノードの数を決定し、前記メッセージを前記バッファに置くことと
を行うように構成されている、
コンピュータシステム。
【請求項２】
各メッセージは、一意の識別子を有し、
メッセージのグループ内において、前記メッセージの一意の識別子は、ツリーによって表される、請求項１に記載のコンピュータシステム。
【請求項３】
子メッセージの前記一意の識別子は、親メッセージを示し、親メッセージの前記一意の識別子は、子メッセージの数を示す、請求項２に記載のコンピュータシステム。
【請求項４】
前記第１のノードは、
親メッセージのメッセージ識別子を受信する入力と、子メッセージに対するメッセージ識別子を提供する出力とを有するメッセージ識別子生成器と、
前記子メッセージに対する前記メッセージ識別子を受信する入力を有するメッセージタッガーであって、前記子メッセージは、前記第１のノードによって出力され、前記メッセージタッガーは、前記メッセージ識別子を前記子メッセージに関連付ける、メッセージタッガーと
を備えている、請求項１に記載のコンピュータシステム。
【請求項５】
前記バッファマネージャは、前記メッセージのグループからの全メッセージが前記第２のノードによって受信されたかどうかを検出するように構成されている、請求項１に記載のコンピュータシステム。
【請求項６】
前記バッファマネージャは、前記メッセージ識別子からの親ノードおよび子ノードの数を前記バッファ内のメッセージの数と比較することによって、前記メッセージのグループからの全メッセージが受信されたかどうかを検出する、請求項５に記載のコンピュータシステム。
【請求項７】
前記第２のノードは、メッセージプロセッサをさらに備え、前記メッセージプロセッサは、前記入力待ち行列および前記バッファからのメッセージを処理し、前記メッセージプロセッサは、前記バッファマネージャがメッセージのグループからの全メッセージが受信されたかどうかを検出した後に、互に対して順番に、前記バッファ内の前記メッセージのグループを処理する、請求項５に記載のコンピュータシステム。
【請求項８】
メッセージを使用してデータを処理するためのコンピュータシステムであって、
各メッセージは、一意の識別子を有し、前記コンピュータシステムは、複数の独立非同期処理ノードを備え、前記処理ノードは、１つ以上のコンピュータ上で稼動する１つ以上のコンピュータプログラムを備え、前記処理ノードは、有向グラフによって表される態様で相互接続されており、
前記処理ノードは、
少なくとも１つの第１のノードであって、前記少なくとも１つの第１のノードは、
入力メッセージを受信するための入力であって、前記入力メッセージは、一意の識別子を伴う親メッセージである、入力と、
前記親メッセージを処理するための第１のメッセージプロセッサであって、前記第１のメッセージプロセッサは、メッセージのグループ内の１つ以上の子メッセージを提供する出力を有する、第１のメッセージプロセッサと、
前記子メッセージを提供する出力と
を備え、
各子メッセージは、前記親メッセージを示す一意の識別子を有し、親メッセージの前記一意の識別子は、子メッセージの数を示すように修正されている、少なくとも１つの第１のノードと、
少なくとも１つの第２のノードであって、前記少なくとも１つの第２のノードは、
メッセージのグループ内のメッセージを記憶するためのメモリ内のバッファと、
他のメッセージを記憶するためのメモリ内の入力待ち行列と、
第２のメッセージプロセッサであって、前記入力待ち行列および前記バッファからのメッセージを処理する第２のメッセージプロセッサと、
バッファマネージャと
を備え、前記バッファマネージャは、
入力メッセージがメッセージのグループ内にあるかどうかを検出することと、
前記メッセージがメッセージのグループ内にある場合、前記メッセージが親ノードであるかどうか決定することと、
前記メッセージが親ノードではない場合、前記メッセージを前記バッファに置くことと、
前記メッセージが親ノードである場合、子ノードの数を決定し、前記メッセージを前記バッファに置くことと
を行うように構成され、
前記バッファマネージャは、前記メッセージのグループからの全メッセージが前記第２のノードによって受信されたかどうかを検出するようにさらに構成され、前記メッセージプロセッサは、前記バッファマネージャが前記メッセージのグループからの全メッセージが受信されたかどうかを検出した後に、前記バッファ内のメッセージのグループを順番に処理する、少なくとも１つの第２のノードと
を含む、コンピュータシステム。
【請求項９】
コンピュータプログラム命令が記憶されたコンピュータ読み取り可能な記憶装置であって、
前記コンピュータプログラム命令は、コンピュータによって処理されると、前記コンピュータにメッセージを使用してデータを処理するためのシステムを実装するように命令し、
前記システムは、複数の独立非同期処理ノードを備え、
前記処理ノードは、１つ以上のコンピュータ上で稼動する１つ以上のコンピュータプログラムを備え、前記処理ノードは、有向グラフによって表される態様で相互接続されており、
前記複数の処理ノードは、メッセージのグループを出力するように構成されている第１のノードを含み、
前記複数の処理ノードは、前記第１のノードによって出力されたメッセージのグループ内のメッセージを順番に処理するように構成されている第２のノードを含み、
前記第２のノードは、
メッセージのグループ内のメッセージを記憶するためのメモリ内のバッファと、
他のメッセージを記憶するためのメモリ内の入力待ち行列と、
バッファマネージャと
を備え、前記バッファマネージャは、
入力メッセージがメッセージのグループ内にあるかどうかを検出することと、
前記メッセージがメッセージのグループ内にある場合、前記メッセージが親ノードであるかどうか決定することと、
前記メッセージが親ノードではない場合、前記メッセージを前記バッファに置くことと、
前記メッセージが親ノードである場合、子ノードの数を決定し、前記メッセージを前記バッファに置くことと
を行うように構成されている、
コンピュータ読み取り可能な記憶装置。
【請求項１０】
各メッセージは、一意の識別子を有し、
メッセージのグループ内において、前記メッセージの一意の識別子は、ツリーによって表される、請求項９に記載のコンピュータ読み取り可能な記憶装置。
【請求項１１】
子メッセージの前記一意の識別子は、親メッセージを示し、親メッセージの前記一意の識別子は、子メッセージの数を示す、請求項１０に記載のコンピュータ読み取り可能な記憶装置。
【請求項１２】
前記第１のノードは、
親メッセージのメッセージ識別子を受信する入力と、子メッセージに対するメッセージ識別子を提供する出力とを有するメッセージ識別子生成器と、
前記子メッセージに対する前記メッセージ識別子を受信する入力を有するメッセージタッガーであって、前記子メッセージは、前記第１のノードによって出力され、前記メッセージタッガーは、前記メッセージ識別子を前記子メッセージに関連付ける、メッセージタッガーと
を備えている、請求項９に記載のコンピュータ読み取り可能な記憶装置。
【請求項１３】
前記バッファマネージャは、前記メッセージのグループからの全メッセージが前記第２のノードによって受信されたかどうかを検出するように構成されている、請求項９に記載のコンピュータ読み取り可能な記憶装置。
【請求項１４】
前記バッファマネージャは、前記メッセージ識別子からの親ノードおよび子ノードの数を前記バッファ内のメッセージの数と比較することによって、前記メッセージのグループからの全メッセージが受信されたかどうかを検出する、請求項１３に記載のコンピュータ読み取り可能な記憶装置。
【請求項１５】
前記第２のノードは、メッセージプロセッサをさらに備え、前記メッセージプロセッサは、前記入力待ち行列および前記バッファからのメッセージを処理し、前記メッセージプロセッサは、前記バッファマネージャがメッセージのグループからの全メッセージが受信されたかどうかを検出した後に、互に対して順番に、前記バッファ内の前記メッセージのグループを処理する、請求項１３に記載のコンピュータ読み取り可能な記憶装置。
【発明の詳細な説明】
【背景技術】
【０００１】
高処理量データフロー処理は、一般に、ノードが計算リソースを表し、エッジがノード間のデータ伝送経路を表す、有向グラフを使用して、データフローを表すことによって実装される。そのような場合、ノードは、非同期データ伝送を使用することによって、相互から非干渉化することができる。この非干渉化は、各計算ノードが次のメッセージの処理を開始することができる前に、下流ノードが処理を完了するのを待つ必要がないので、各計算ノードが可能な限り効率的に実行することを可能にする。ある場合には、複数の計算ノードは、並列に実行され、単一計算ノードとして、一緒に作用し、したがって、多くの作業ユニットを同時に処理することができる。
【０００２】
Ｓｔａｇｅｄ  Ｅｖｅｎｔ  Ｄｒｉｖｅｎ  Ａｒｃｈｉｔｅｃｔｕｒｅ（ＳＥＤＡ）は、計算ノード間に有界待ち行列を挿入することによって、このアプローチを向上させる。ノードＡが作業を別のノードＢに転送しようとする場合、ノードＡとＢとの間の待ち行列が一杯である場合、Ａは、Ｂが待ち行列からのいくつかの作業を実行するまで、ブロッキングを行う。Ａのこのブロッキングは、Ａが新しい作業を実行し、順に、その入力待ち行列を一杯にしないように防止し、任意の先行オペレーションをブロッキングする。そのような技法を利用する、プロセスの一例は、複数の形態のドキュメント（電子メール、ＰＤＦ、マルチメディア、ブログ掲載等）がすべて、後続読み出しのために、検索エンジンによって処理およびインデックス化される必要がある、検索エンジンのドキュメント取り込みである。
【０００３】
大量のデータを処理することができるスケーラブルなシステムは、そのような非同期有向グラフモデルを使用することによって提供することができる。いくつかのアプリケーションでは、ドキュメントは、順番に処理される必要があり得る。しかしながら、非同期有向グラフモデルに基づくシステムは、概して、ドキュメントが順番に処理されることを保証することができない。特許文献１に描写される、この問題に対する以前の解決策の１つは、全メッセージが順番に処理されるシステムである。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許出願公開第２０１０／０００５１４７号明細書
【発明の概要】
【課題を解決するための手段】
【０００５】
処理が有向グラフによって表される高並列非同期データフロー処理システムは、従属メッセージのグループを生成し、処理し、そのようなグループ内のメッセージを順番に処理する処理ノードを含むことができる。他のメッセージは、処理ノードによって受信される順番に処理することができる。
【０００６】
従属メッセージのグループを識別するために、メッセージ識別子がメッセージに適用される。メッセージの処理は、子メッセージを生成し得る。子メッセージは、親メッセージの関連付けられたメッセージ識別子を組み込むメッセージ識別子が割り当てられる。親メッセージのメッセージ識別子は、関連子メッセージの数を示すように注釈付けされる。
【０００７】
メッセージのグループが順番に処理ノードによって処理される場合、処理ノードは、グループ内のメッセージが記憶されるバッファを維持する。メッセージが受信されると、そのメッセージ識別子は、それがグループ内にあるかどうか、該当する場合、その親ノード、および、親ノードである場合にそれが有する子ノードの数を示す。この情報から、グループ内の全メッセージが受信されたかどうかを決定することができる。グループ内の全メッセージが受信されると、処理ノードは、メッセージを順番に処理することができる。
本発明はさらに、例えば、以下を提供する。
（項目１）
メッセージを使用してデータを処理するためのコンピュータシステムであって、
有向グラフによって表される態様で相互接続されている複数の独立非同期処理ノードを備え、
前記複数の処理ノードは、メッセージのグループを出力するように構成されている第１のノードを含み、
前記複数の処理ノードは、前記第１のノードによって出力されたメッセージのグループ内のメッセージを順番に処理するように構成されている第２のノードを含む、
コンピュータシステム。
（項目２）
各メッセージは、一意の識別子を有し、
メッセージのグループ内において、前記メッセージの一意の識別子は、ツリーによって表される、項目１に記載のコンピュータシステム。
（項目３）
子メッセージの前記一意の識別子は、親メッセージを示し、親メッセージの前記一意の識別子は、子メッセージの数を示す、項目２に記載のコンピュータシステム。
（項目４）
前記第１のノードは、
親メッセージのメッセージ識別子を受信する入力と、子メッセージに対するメッセージ識別子を提供する出力とを有するメッセージ識別子生成器と、
前記子メッセージに対する前記メッセージ識別子を受信する入力を有するメッセージタッガーであって、前記子メッセージは、前記第１のノードによって出力され、前記メッセージタッガーは、前記メッセージ識別子を前記子メッセージに関連付ける、メッセージタッガーと
を備えている、項目１に記載のコンピュータシステム。
（項目５）
前記第２のノードは、
メッセージのグループ内のメッセージを記憶するためのバッファと、
他のメッセージを記憶するための入力待ち行列と、
バッファマネージャと
を備え、前記バッファマネージャは、
入力メッセージがメッセージのグループ内にあるかどうかを検出することと、
前記メッセージがメッセージのグループ内にある場合、前記メッセージが親ノードであるかどうか決定することと、
前記メッセージが親ノードではない場合、前記メッセージを前記バッファに置くことと、
前記メッセージが親ノードである場合、子ノードの数を決定し、前記メッセージを前記バッファに置くことと
を行うように構成されている、項目１に記載のコンピュータシステム。
（項目６）
前記バッファマネージャは、前記メッセージのグループからの全メッセージが前記第２のノードによって受信されたかどうかを検出するように構成されている、項目５に記載のコンピュータシステム。
（項目７）
前記バッファマネージャは、前記メッセージ識別子からの親ノードおよび子ノードの数を前記バッファ内のメッセージの数と比較することによって、前記メッセージのグループからの全メッセージが受信されたかどうかを検出する、項目６に記載のコンピュータシステム。
（項目８）
前記第２のノードは、メッセージプロセッサをさらに備え、前記メッセージプロセッサは、前記入力待ち行列および前記バッファからのメッセージを処理し、前記メッセージプロセッサは、前記バッファマネージャがメッセージのグループからの全メッセージが受信されたかどうかを検出した後に、互に対して順番に、前記バッファ内の前記メッセージのグループを処理する、項目６に記載のコンピュータシステム。
（項目９）
前記第１のノードは、
入力メッセージを受信するための入力であって、前記入力メッセージは、一意の識別子を伴う親メッセージである、入力と、
前記親メッセージを処理するための第１のメッセージプロセッサであって、前記第１のメッセージプロセッサは、メッセージのグループ内の１つ以上の子メッセージを提供する出力を有する、第１のメッセージプロセッサと、
前記子メッセージを提供する出力と
を備え、
各子メッセージは、前記親メッセージを示す前記一意の識別子を有し、親メッセージの前記一意の識別子は、子メッセージの数を示すように修正されている、項目１に記載のコンピュータシステム。
（項目１０）
前記第２のノードは、
メッセージのグループ内のメッセージを記憶するためのバッファと、
他のメッセージを記憶するための入力待ち行列と、
第２のメッセージプロセッサであって、前記入力待ち行列および前記バッファからのメッセージを処理する第２のメッセージプロセッサと、
バッファマネージャと
を備え、前記バッファマネージャは、
入力メッセージがメッセージのグループ内にあるかどうかを検出することと、
前記メッセージがメッセージのグループ内にある場合、前記メッセージが親ノードであるかどうか決定することと、
前記メッセージが親ノードではない場合、前記メッセージを前記バッファに置くことと、
前記メッセージが親ノードである場合、子ノードの数を決定し、前記メッセージを前記バッファに置くことと
を行うように構成され、
前記バッファマネージャは、前記メッセージのグループからの全メッセージが前記第２のノードによって受信されたかどうかを検出するようにさらに構成され、前記メッセージプロセッサは、前記バッファマネージャが前記メッセージのグループからの全メッセージが受信されたかどうかを検出した後に、前記バッファ内のメッセージのグループを順番に処理する、項目９に記載のコンピュータシステム。
【図面の簡単な説明】
【０００８】
【図１】図１は、有向グラフを使用して、処理を表す高並列非同期データフロー処理システムを実装する例示的コンピュータシステムのブロック図である。
【図２】図２は、メッセージ識別子がどのようにメッセージに割り当てられるかを描写する、流れ図である。
【図３Ａ】図３Ａ−３Ｄは、有向グラフを使用して、ドキュメント取り込みシステム内の複数の処理ノードを表す追加の実施例のブロック図である。
【図３Ｂ】図３Ａ−３Ｄは、有向グラフを使用して、ドキュメント取り込みシステム内の複数の処理ノードを表す追加の実施例のブロック図である。
【図３Ｃ】図３Ａ−３Ｄは、有向グラフを使用して、ドキュメント取り込みシステム内の複数の処理ノードを表す追加の実施例のブロック図である。
【図３Ｄ】図３Ａ−３Ｄは、有向グラフを使用して、ドキュメント取り込みシステム内の複数の処理ノードを表す追加の実施例のブロック図である。
【図４】図４は、メッセージのグループを生成する処理ノードのための例示的構造のブロック図である。
【図５】図５は、メッセージのグループを処理する処理ノードのための例示的構造のブロック図である。
【図６】図６は、図４におけるような処理ノードがどのように動作し得るかの実施例を描写する流れ図である。
【図７】図７は、図５におけるような処理ノードがどのように動作し得るかの実施例を描写する流れ図である。
【発明を実施するための形態】
【０００９】
インデックス化され、検索可能であるデータ記憶装置へのドキュメントの処理および取り込みは、多数のステップを伴い、そのうちのいくつかは、特定の順序で実行され、その他は、並行して処理される。本明細書で使用される場合、用語「ドキュメント」とは、．ｐｄｆファイル、ビデオ、オーディオ、電子メール等の非構造化データ、またはＸＭＬファイル、．ｃｓｖファイル、あるいはデータベースソースから受信したデータ等の構造化データを指し得る。ドキュメント処理および取り込みを促進するために、ドキュメントは、一意のメッセージＩＤを有するメッセージ内に保持される。
【００１０】
いくつかのドキュメント（例えば、複数の添付ファイルを有する電子メール）は、さらに他のドキュメントを含む。そのようなドキュメントは、ドキュメントを処理する、複数の処理スレッドの可能性、ドキュメントの異なる部分に対しする異なる処理時間の可能性、および、ドキュメントの再帰的処理の可能性を導入する。そのようなドキュメントからのデータのデータベースへの収容がドキュメントの処理の完了に依存する場合、そのような可能性は、ドキュメントの処理に有意な複雑性を導入する。
【００１１】
図１は、ドキュメントを処理するための、高並列非同期データフロー処理システムを実装する例示的コンピュータシステムを例証し、有向グラフを使用して処理を表す。１つ以上のドキュメント１１０は、レコードベースのデータベース管理システム（ＲＤＢＭＳ）等、ドキュメント記憶装置１００を介して、システムに入力を供給する。ドキュメント１１０は、メッセージ１１１内に挿入され、メッセージ１１１も各々は、一意のメッセージ識別子を有する。処理ノード１２０ａ−ｃは、メッセージ１１１を受信し、適宜、それら内のドキュメントを処理する。各処理ノード１２０ａ−ｃは、複数のスレッドプールを備え、複数のスレッドプールは、同時に、多くのメッセージ１１１の処理を可能にし得る。入力待ち行列１２５ａ−ｄは、各処理ノードに先行する。入力待ち行列１２５ａ−ｄは、各ノードがリソースを過剰に投入せずにメッセージを処理することを可能にし、待ち行列が一杯になる場合に、先行ノードをブロッキングする。したがって、入力待ち行列１２５ａ−ｄは、スレッドプールとともに、全体的システムにかかる負荷を抑制する。各メッセージは、処理された後、例えば、インデックス化された検索可能データ記憶装置１４０に取り込まれ得る。
【００１２】
そのようなシステムは、典型的には、プラットフォーム（例えば、オペレーティングシステムおよびアプリケーション処理フレームワークを伴うコンピュータ）を使用して実装され、プラットフォームは、仕様に準拠するプログラマによって作成されるアプリケーションを処理するように設計されている。例えば、プログラマは、高並列任意有向グラフを形成する相互接続された処理ノードを伴うアプリケーションを作成する。
【００１３】
そのようなアプリケーションでは、アプリケーションプログラマは、特定の処理ノードが、メッセージを生成し得るか、または、メッセージを互に対して特定の順番で処理するかどうか決定するであろう。大部分のメッセージは、順番に処理される必要はない。順序化されたメッセージ処理を必要としない処理ノードは、メッセージ順序化を考慮することなく他のノードと並行して稼動することができる。しかしながら、いくつかの処理ノードは、単一メッセージから、複数のメッセージ、すなわち、メッセージのグループを作成し、このメッセージのグループ内のメッセージは、互に対して順番に処理される必要があり得る。また、処理ノードは、メッセージのグループから、メッセージのうちの１つ以上を受信し得、互に対して順番に受信したメッセージを処理する必要があり得る。グループ内にない他のメッセージは、グループに対して、任意の順番で処理することができる。アプリケーションプログラマは、処理ノードが従属メッセージのグループを生成するかどうか、および処理ノードが、順番に、従属メッセージのグループからのメッセージを処理するかどうか決定するであろう。
【００１４】
一般に、メッセージ順序化は、従属メッセージを一緒にグループ化することによって、このシステム内に維持される。例として、メッセージのグループは、ツリーとしてメッセージ間の従属を表すメッセージ識別子を使用することによって識別され得る。個々のノードおよび処理されるメッセージの特性は、順序化制約が満たされ、再帰的処理が全体的システム性能に影響を及ぼすことなく可能にされるように、メッセージフローを方向付けるために使用される。例えば、いくつかの処理ノードは、順序化されたメッセージ処理を必要としないことがあり、いくつかのメッセージタイプは、任意の特定の順番で処理されることを必要としない。
【００１５】
任意の処理ノードは、順序化された処理を必要とするメッセージのグループからのメッセージを処理しているかどうかを検出するように構成されることができる。例えば、図１では、処理ノード１３０は、メッセージのグループからのメッセージを検出し、次いで、処理を停止し、メッセージのグループ内の受信したメッセージに先行するメッセージの受信を待つ。グループの順序化されたメッセージ処理を必要とする処理ノードは、そのように注釈付けされ、メッセージ識別子に基づいて、順番に、メッセージのグループ内のメッセージを配信する修正入力待ち行列によって先行される。
【００１６】
図２は、メッセージ識別子をメッセージに割り当てるための方法２００を説明する流れ図である。ステップ２１０では、メッセージ識別子を伴うメッセージが受信される。次に、２２０では、メッセージが処理され、１つ以上の子メッセージが生成される。例えば、電子メール等のメッセージは、複数の添付ファイルを含み得、子メッセージは、各添付ファイルに対して生成される。２３０では、子メッセージは、親メッセージのメッセージ識別子を組み込むようにエンコードされるメッセージ識別子が割り当てられる。２４０では、親メッセージのメッセージ識別子は、子メッセージの数を示すように注釈付けされる。この注釈は、処理ノードが全関連メッセージが受信された場合を把握することを可能にする。方法２００は、特定のシーケンスで発生するように示されるが、他の実施形態では、同様に、他のシーケンスも可能である。従属メッセージのグループを生成する、処理ノードは、このメッセージ識別子割当プロセスを実装する。
【００１７】
例えば、ステップ２１０において、メッセージ識別子「１」を有し、複数の添付ファイルを含む電子メールメッセージであるメッセージが受信されると仮定する。２２０では、電子メール処理ノードは、電子メールメッセージを処理し、各添付ファイルに対して、子メッセージを生成する。各添付ファイルは、親のメッセージ識別子を組み込むメッセージの中に挿入される。この場合、親識別子は、「１」である。したがって、２つの添付ファイルがある場合、第１の添付ファイルは、マルチパートメッセージ識別子「１．１」を伴うメッセージの中に挿入され、第２の添付ファイルは、識別子「１．２」を伴うメッセージの中に挿入されるであろう。２４０では、親メッセージのメッセージ識別子は、２つの子メッセージを有するように注釈付けされる。さらに、子ドキュメント「１．１」が２つの子を有すると仮定する。２２０では、子メッセージが生成され、２３０では、子メッセージは、ＩＤ「１．１．１」および「１．１．２」が割り当てられる。子ドキュメント「１．１」は、次いで、２４０において、２つの子を有するように注釈付けされる。
【００１８】
図３Ａ−３Ｄは、有向グラフを使用して、ドキュメント取り込みシステム内の複数の処理ステップ（ノード）を表す、例示的アプリケーションを例証する。１つ以上のドキュメントソースが処理ノード３０２を介して、システムに入力を提供する。ソースとして、ファイルシステムリポジトリ、電子メールサーバ、物理的媒体（例えば、ＣＤ−ＲＯＭ、ＤＶＤ）、音声認識システムから変換されたテキスト、データベース等が挙げられ得る。処理ノード３０２は、外部ソースからのドキュメント、または、追加のドキュメントが処理中に「発見」され、システムに戻るようにルーティングされる場合のドキュメントの処理ステップへの取り込みを管理する。ドキュメントは、最初に、ドキュメントタイプスプリッタ３０４にルーティングされる。スプリッタ３０４は、どの後続処理ノード（または、複数のノード）にメッセージを送信すべきかを決定する。例えば、システムは、電子メールテキスト（ある場合には、ヘッダ情報および／またはルーティング情報ならびに電子メールテキストを含み得る）を処理するための電子メールノード３０６、ｐｋＺＩＰまたはいくつかの他のファイルアーカイブまたは圧縮プログラムを使用して作成されるドキュメントを処理するための．ｚｉｐ処理ノード３０８、Ｍｉｃｒｏｓｏｆｔ  Ｗｏｒｄ（または、ＧＯＯＧＬＥ  ＤＯＣＳ、Ｏｐｅｎ  Ｏｆｆｉｃｅ等の他のワード処理プログラム）を使用して作成されるドキュメントを処理するための．ｄｏｃ処理ノード３１０、およびポータブルドキュメント形式におけるドキュメントを処理するための．ｐｄｆ処理ノード３１２を含み得る。図示されない処理ノードの他の例として、画像を処理するための．ｊｐｇ処理ノード、動画を処理するための．ｍｐｅｇノード、オーディオを処理するための．ａｖｉノード、種々の構造化データ形式を処理するためのノード等が挙げられる。提供される実施例では、４つの異なる処理ノードが存在する。しかしながら、任意の数のノードが可能であって、典型的には、システムに利用可能なドキュメントの数およびタイプに基づく。ある場合には、アプリケーションは、そのタイプの多数のドキュメントが頻繁に見られる場合、および／またはプロセスがリソース集約的である場合、同一機能を果たす複数の処理ノード（例えば、．ｊｐｇファイル専用の３つのノード）を含み得る。
【００１９】
いくつかの事例では、処理ノードは、メッセージを、さらなる分析を受ける追加のメッセージに分割する。例えば、電子メールは、１つ以上の添付ファイルを有し得、それらの各々この、異なる処理ノードにおいて、異なる処理を受ける。さらに、ドキュメントインデックスの完全性を維持するために、２つ以上の構成要素を有するドキュメントは、全構成要素が正常に処理されない限り、かつそれまで、インデックスに書き込まれるべきではない事例も存在し得る。言い換えると、電子メールへのある添付ファイルの処理が失敗する場合、電子メールのテキスト（および、正常に処理された他の構成要素または添付ファイル）は、インデックスに書き込まれるべきではない。いくつかの実装は、部分的ドキュメントインデックス化を可能にし得る一方、他の実装では、本制約は、例外なく、実施され得る。ある場合には、ルールを使用して、どの「失敗」が容認可能とみなされ、どれが致命的であるかを決定し得る。図２に関連して上に描写されたメッセージ識別子は、この目的のために、親メッセージ、例えば、電子メールを含むメッセージを、子メッセージ（例えば、電子メール添付ファイル）に関連付けるように使用される。親メッセージは、生成される子メッセージの数を示すように注釈付けされる。
【００２０】
一般に、各処理ノードは、メッセージ待ち行列を含む。メッセージ待ち行列は、特定のノードにおいて、処理を待つ複数のメッセージを記憶するために使用される。メッセージ待ち行列は、順番から外れて処理待ち行列に到着した場合に、そのメッセージ識別子に基づいて、従属メッセージのグループ内のメッセージを並べ替えることもできる。
【００２１】
図３Ａは、一実施形態による、単純な電子メールメッセージ（例えば、メッセージテキストを有するが、添付ファイルを有していない、電子メール）がどのように処理されるかを例証する。電子メールがシステムに入るのに伴って、０のメッセージＩＤが割り当てられたメッセージに挿入され、ドキュメントタイプスプリッタ待ち行列３０４ａに転送される。ドキュメントは、次いで、リソースが利用可能である場合、スプリッタ３０４に進む。スプリッタ３０４は、それを電子メールとして認識し、電子メール処理ノード３０６による処理に備えて、メッセージを電子メール待ち行列３０６ａに転送する。
【００２２】
電子メールが添付ファイルを含む事例では、電子メールを含むメッセージは、電子メールに関連付けられた子メッセージが存在することを示すように注釈付けされ、それによって、インデクサは、インデックス待ち行列３１８を処理する場合、全ての関連メッセージが受信されたときを把握し得る。新しい「子」メッセージが下流処理のために生成されると、現在のメッセージは、「子を有する」としてマークされ、新しい子メッセージは、親ＩＤを組み込むようにエンコードされるメッセージＩＤに割り当てられる。そのようなメッセージの相互参照は、メッセージがすべてのその子（または、その親および兄弟メッセージ）が処理のために、後続処理ノードに到着するまで、その後続処理ノードに保持されることを可能にする。
【００２３】
処理を要求するメッセージ（例えば、電子メールノード３０６におけるメッセージＩＤ０）は、処理され、インデックス待ち行列３１８に転送され、利用可能である場合、インデックスに解放される。
【００２４】
図３Ｂ−３Ｄは、電子メールメッセージが２つの添付ファイル（．ｐｄｆファイルと、複数の圧縮された．ｄｏｃファイルを含む、．ｚｉｐファイル）を有する、若干より複雑な場合を例証する。図３Ｂを具体的に参照すると、電子メールノード３０６において処理後、各添付ファイルは、次のマルチパートメッセージＩＤが割り当てられ、処理ノード３０２に戻るように再ルーティングされ、ドキュメント待ち行列３０４ａに置かれる。ドキュメントスプリッタ３０４は、．ｐｄｆファイルを含む子メッセージを．ｐｄｆ待ち行列３１２ａに、．ｚｉｐファイルを含む子メッセージを．ｚｉｐ待ち行列３０８ａに転送する。これらの２つの子メッセージは、親メッセージＩＤ  ０を用いてエンコードされ、それらのそれぞれの処理ノード３０８および３１２で処理される。．ｚｉｐファイルを処理する間に、．ｚｉｐノード３０８は、．ｚｉｐファイル内に含まれる複数のファイルが存在することを認識し、メッセージに関連するｎ個の子メッセージが存在するという指示によって、メッセージに注釈付けする（ｎは、．ｚｉｐファイル内に含まれるファイルの数を表す）。子メッセージは、次いで、インデックス待ち行列３１８に転送される。インデックサは、同一メッセージＩＤを有する全メッセージが受信されたことを決定する。しかしながら、インデックサは、．ｚｉｐ子メッセージが２つの追加の子メッセージ（．ｄｏｃファイル）が存在するという指示を含むので、２つのメッセージを処理しないことがある。したがって、インデックサは、それらのファイルの処理が完了するのを待つ。
【００２５】
次に、図３Ｃを参照すると、．ｚｉｐファイルコンテンツは、マルチパートメッセージ識別子が割り当てられ、処理ノード３０２に戻るように再ルーティングされ、ドキュメント待ち行列３０４ａに転送される。スプリッタ３０４は、新しいマルチパートメッセージＩＤを有する２つの．ｄｏｃファイルを．ｄｏｃ待ち行列３１０ａに転送する。新しいマルチパートメッセージＩＤを有する全メッセージがインデックス待ち行列３１８にルーティングされる。インデックスは、メッセージをインデックス内に記憶する前に、初期マルチパートメッセージＩＤ（２つの子）および新しいマルチパートメッセージＩＤ（１つの子）を有するオリジナルメッセージ内に記述される子メッセージの受信を待つであろう。図３Ｄは、メッセージＩＤ  ０ならびにインデックス待ち行列３１８に置かれるその子メッセージ（．ｚｉｐファイルおよび．ｐｄｆファイル）および孫メッセージ（．ｄｏｃファイル）の階層リストを有するメッセージを例証する。
【００２６】
図４は、メッセージのグループを生成する、処理ノードのための例示的構造のブロック図である。
【００２７】
処理ノードは、概して、現在のメッセージ４１８を処理するメッセージプロセッサ４００を含む。このメッセージプロセッサ４００は、メッセージを処理した結果として、結果４０２を生成し得る。例えば、これは、．ｚｉｐファイルに関連付けられたメタデータの処理を含み得る。メッセージプロセッサ４００は、処理されている現在のメッセージの子メッセージである、１つ以上の出力メッセージ４０４も出力し得る。例えば、この処理ノードが．ｚｉｐファイルを処理するためのものである場合、ｚｉｐファイルの以前のコンテンツを削除するためのメッセージ（ｚｉｐファイルの以前のバージョンの処理の結果）が生成される。加えて、．ｚｉｐファイル内の各ドキュメントは、出力メッセージ４０４となる。メッセージプロセッサ４００は、次いで、ＩＤ生成器４０６に、トリガ４０８を通して、現在のメッセージのメッセージ識別子４１２を使用して、子メッセージのためのメッセージ識別子４１０を生成するように命令するであろう。ＩＤ生成器４０６は、次いで、現在のメッセージ識別子４１２を更新し、追加の子メッセージを有することを示す。メッセージタッガー（ｍｅｓｓａｇｅ  ｔａｇｇｅｒ）４１４は、子メッセージ識別子４１０によって、出力メッセージ４０４にタグ付けし、タグ付けされたメッセージ４１６を出力する。メッセージプロセッサ４００が２つ以上の子メッセージを出力する場合、各子メッセージが出力されるのに伴って、現在のメッセージのメッセージ識別子４１２が更新され、生成された子メッセージの数を反映する。現在のメッセージ４１８は、次いで、結果４０２およびＩＤ生成器４０６によって修正されたメッセージ識別子によって増加され、出力される。図５は、メッセージのグループを処理する処理ノードのための例示的構造のブロック図である。
【００２８】
処理ノードは、概して、現在のメッセージを処理するメッセージプロセッサ５００を含む。このメッセージプロセッサ５００は、メッセージの処理の結果、結果５０２を出力し得る。従属メッセージのグループを順番に処理する処理ノードは、グループの全メッセージが受信されるまで、グループからのメッセージを記憶するためのソートバッファまたは待ち行列５０６を使用し、親メッセージが受信された後、グループ内のメッセージの処理を開始することができる。グループからのメッセージの処理開始まで、その入力待ち行列５０４からの他のメッセージを処理することができる。グループ内のメッセージ処理の間、メッセージプロセッサ５００は、入力待ち行列５０４からのメッセージも処理し得る。
【００２９】
処理ノードは、各入力メッセージ５０８を処理し、モジュール「グループ？」５１０によって示されるように、メッセージが従属メッセージのグループ内にあるかどうか決定する（メッセージ識別子によって示されるように）。メッセージがグループ内でない場合、入力待ち行列５０４に置かれ、メッセージプロセッサ５００によって、随時、処理することができる。メッセージがグループ内である場合、メッセージがモジュール「親？」５１２によって示されるように、グループの親ノードであるか、またはグループ内の親ノードであるかどうかも決定される（メッセージ識別子によって示されるように）。メッセージがグループ内にあるかどうか、および／または親ノードであるかどうかは、バッファマネージャ５１４に示される。バッファマネージャは、従属メッセージのグループ内の着信メッセージを追跡し、それらをバッファ５０６に置く。バッファマネージャは、グループ内の全メッセージが受信されたかどうかも決定し（メッセージ識別子を確認することによって）、「グループ完了」指示子をメッセージプロセッサ５００に提供する。メッセージプロセッサ５００は、次いで、順番に、バッファから、グループのメッセージの処理を開始することができる。次に、図４におけるような処理ノードがどのように動作し得るかを説明する流れ図が図６に関連して描写される。
【００３０】
処理ノードは、ステップ６００において、現在のメッセージを受信し、現在のメッセージ識別子を記憶する。処理ノードは、現在のメッセージの処理を開始する６０２。子メッセージが現在のメッセージを処理することによって生成される場合、子メッセージが生成される６０４。子メッセージ識別子が、次いで、生成される６０６。現在のメッセージ識別子は、次いで、更新され６０８、現在のメッセージが少なくとも１つの子メッセージを有することを反映する。この子メッセージが第１の子メッセージである場合、現在のメッセージ識別子は、子メッセージの数のインジケータを追加するように変更され、子メッセージの数のインジケータは１に設定される。そうでなければ、子メッセージの数は、インクリメントされる。子メッセージは、次いで、ステップ６１０において、そのメッセージ識別子によってタグ付けされ、出力される。追加の子メッセージが６１２における決定に伴って、検出される場合、このプロセスは、ステップ６０４から６１０まで反復する。ステップ６１２の前後両方において、現在のメッセージの処理は、継続し、最終的には、完了する（６１４に示されるように）。
【００３１】
次に、図５におけるような処理ノードがどのように動作し得るかを説明する流れ図が図７に関連して描写される。
【００３２】
図７では、処理ノードは、入力メッセージを受信する７００。メッセージがそのメッセージ識別子を確認することによって、従属メッセージのグループ内にあるかどうか決定される７０２。メッセージがグループ内にない場合、入力待ち行列に置かれる７０４。メッセージがグループ内にある場合、メッセージが親ノードであるかどうか決定される７０６。メッセージが親ノードではない場合、バッファに置かれる７０８。メッセージが親ノードである場合、子ノードの数が、例えば、そのメッセージ識別子から、子ノードの数を抽出することによって、決定される７１０。メッセージは、次いで、バッファに置かれる７０８。処理ノードは、次いで、メッセージのグループからの全メッセージがバッファ内に存在するかどうか決定する７１２。全メッセージが受信された場合、処理ノードは、グループの処理を開始することができると命令される７１４。グループからのメッセージが処理され、バッファに置かれた後、またはメッセージが入力待ち行列に置かれた場合、処理ノードは、７００において、次の着信メッセージの処理に備えている。処理ノードは、入力メッセージが入力待ち行列またはバッファに方向付けられている間、入力待ち行列内またはバッファ内の完了グループからのメッセージを処理し得る。
【００３３】
明細書全体を通して描写される、処理ノードおよびその構成要素およびモジュールは、全体的または部分的に、任意の好適なプログラミング言語または複数の言語（Ｃ＋＋、Ｃ＃、ｊａｖａ、Ｖｉｓｕａｌ  Ｂａｓｉｃ、ＬＩＳＰ、ＢＡＳＩＣ、ＰＥＲＬ等）を使用して、１つ以上のプロセッサ上で動作する、１つ以上のコンピュータプログラムの組み合わせとして、および／またはハードウェアデバイス（例えば、ＡＳＩＣ、ＦＰＧＡ、プロセッサ、メモリ、記憶装置、および同等物）として、実装することができる。
【００３４】
本発明の方法およびシステムの実装は、１つのコンピュータシステム内における集中方式において、または異なる要素がいくつかの相互接続されたコンピュータシステムにわたって分配される分散方式において実現することができる。任意の種類のコンピュータシステムまたは本明細書に描写される方法を実行するために適合される他の装置が本明細書に描写される機能を果たすために好適である。
【００３５】
ハードウェアおよびソフトウェアの典型的組み合わせは、ロードおよび実行されると、本明細書に描写される方法を実行するように、コンピュータシステムを制御する、コンピュータプログラムを伴う汎用コンピュータシステムであり得る。本発明はまた、本明細書に描写される方法の実装を有効にする全特徴を備え、コンピュータシステム内にロードされると、これらの方法を実行可能である、コンピュータプログラム製品内に埋め込むことができる。
【００３６】
本文脈におけるコンピュータプログラムまたはアプリケーションは、任意の言語、コード、または表記において、直接、あるいはａ）別の言語、コード、または表記への変化、ｂ）異なる材料形態における複製の一方または両方後、情報処理能力を有するシステムに、特定の機能を行われるように意図された一式の命令の任意の表現を意味する。有意に、本発明は、その精神または本質的属性から逸脱することなく、他の具体的形態で具現化することができる。前述の実施形態は、したがって、あらゆる観点から、本明細書に描写される本発明に対する限定ではなく、例証とみなされる。
【図１】
0005449627.tif 000002
【図２】
0005449627.tif 000003
【図３Ａ】
0005449627.tif 000004
【図３Ｂ】
0005449627.tif 000005
【図３Ｃ】
0005449627.tif 000006
【図３Ｄ】
0005449627.tif 000007
【図４】
0005449627.tif 000008
【図５】
0005449627.tif 000009
【図６】
0005449627.tif 000010
【図７】
0005449627.tif 000011