(57)【要約】  記録装置（１）の記憶領域（９）のうちの第１の記録位置から第２の記録位置に向けて、可変長データと、それぞれ同データ長を示し、同データの前方及び後方に記録される前方及び後方データ長情報（１０３，１１３）を含むデータセットを順次記録し、第１の記録位置に戻って、第１の記録位置から第２の記録位置に向けて、記録済のデータを新たなデータセットで上書きした状態で、第２の記録位置から第１の記録位置に向けて後方データ長情報から求まる後方データ長情報の記録位置に対応する後方データ長情報が存在するデータセットが連続的に発見される第１の記録領域を特定し、第１の記録位置から第２の記録位置に向けて、後方データ長情報から求まる後方データ長情報の記録位置に対応する後方データ長情報が存在し、第１の記録領域に差し掛からず、第１の記録領域に最も近い位置に記録されたデータセットに続いて、次データセットの記録開始位置として利用する。
2013140516.tif 000002
【特許請求の範囲】
【請求項１】
記録装置にデータを記録する記録方法において、
処理装置は、
前記記録装置の記憶領域のうちの第１の記録位置から第２の記録位置に向けて、可変長データと、それぞれ該可変長データのデータ長を示し、該可変長データの前方及び後方に記録される前方及び後方データ長情報を含むデータセットを順次記録し、残り記録領域の不足発生に応じて前記第１の記録位置に戻って、前記第１の記録位置から前記第２の記録位置に向けて、記録済のデータを新たなデータセットで上書きした状態において、前記第２の記録位置から前記第１の記録位置に向けて後方データ長情報から求まる前方データ長情報の記録位置に対応する前方データ長情報が存在するデータセットが連続的に発見される第１の記録領域を特定し、
前記第１の記録位置から前記第２の記録位置に向けて、前方データ長情報から求まる後方データ長情報の記録位置に対応する後方データ長情報が存在するデータセットであって、前記第１の記録領域に差し掛からず、前記第１の記録領域に最も近い位置に記録されたデータセットに後続させて、次のデータセットの記録開始位置として利用する、
処理を実行することを特徴とする記録方法。
【請求項２】
次のデータセットの記録時に、該データセットの一部の位置と記録済のデータの前方データ長情報の位置とが一致し、かつ該データセットの一部の値と前記記録済のデータの前方データ長情報とが一致する場合に、前記次のデータセットの前記一部の値をビット反転させると共に、前記ビット反転させた位置の情報を前記次のデータセット内に記憶することを特徴とする請求項１記載の記録方法。
【請求項３】
前記次のデータセットの記録時に、前記記憶装置の前記次のデータセットの記録開始位置から前記記憶装置の第２の記録位置までの領域が、前記次のデータセットを記録するのに不足する場合、前記次のデータセットの一部を前記記憶装置の前記第２の記録位置まで記録すると共に、前記次のデータセットが分割されていることを示す情報を前記記憶装置の第１の記録位置に記録し、続いて前記次のデータセットの残りを記録することを特徴とする請求項１又は２記載の記録方法。
【請求項４】
前記データセットは前記データセットの先頭を表わす情報と前記データセットの最後尾を表わす情報とを更に含み、
前記第１の記録領域の特定時に、前記前方データ長情報と前記後方データ長情報との比較の結果両者が不一致となり、かつ前記先頭を表わす情報と前記最後尾を表わす情報とが不一致となる箇所を前記第１の記録領域として特定する請求項２記載の記録方法。
【請求項５】
前記データセットは、前記記憶装置への書き込みのローテーションを示す情報を更に含み、
前記第１の記録領域の特定時に、前記前方データ長情報と前記後方データ長情報との比較の結果両者が不一致となり、かつ前記ローテーションを示す情報と、１つ後方のデータセットのローテーションを示す情報とが不一致となる箇所を前記第１の記録領域として特定することを特徴とする請求項２記載の記録方法。
【請求項６】
前記次のデータセットの記録時に、別の記憶装置に、前記書き込むデータセットの前方データ長情報及び前記記憶装置の前記第１の記録位置からのオフセットと、次のデータセットを書き込む位置とを記憶することを特徴とする請求項１記載の記録方法。
【請求項７】
記憶領域を有する記録装置であって、
前記記録装置の記憶領域のうちの第１の記録位置から第２の記録位置に向けて、可変長データと、それぞれ該可変長データのデータ長を示し、該可変長データの前方及び後方に記録される前方及び後方データ長情報を含むデータセットを順次記録し、残り記録領域の不足発生に応じて前記第１の記録位置に戻って、前記第１の記録位置から前記第２の記録位置に向けて、記録済のデータを新たなデータセットで上書きした状態において、前記第２の記録位置から前記第１の記録位置に向けて後方データ長情報から求まる前方データ長情報の記録位置に対応する前方データ長情報が存在するデータセットが連続的に発見される第１の記録領域を特定し、
前記第１の記録位置から前記第２の記録位置に向けて、前方データ長情報から求まる後方データ長情報の記録位置に対応する後方データ長情報が存在するデータセットであって、前記第１の記録領域に差し掛からず、前記第１の記録領域に最も近い位置に記録されたデータセットに後続させて、次のデータセットの記録開始位置として利用することを特徴とする記録装置。
【請求項８】
次のデータセットの記録時に、該データセットの一部の位置と記録済のデータの前方データ長情報の位置とが一致し、かつ該データセットの一部の値と前記記録済のデータの前方データ長情報とが一致する場合に、前記次のデータセットの前記一部の値をビット反転させると共に、前記ビット反転させた位置の情報を前記次のデータセット内に記憶することを特徴とする請求項７記載の記録装置。
【請求項９】
前記次のデータセットの記録時に、前記記憶装置の前記次のデータセットの記録開始位置から前記記憶装置の第２の記録位置までの領域が、前記次のデータセットを記録するのに不足する場合、前記次のデータセットの一部を前記記憶装置の前記第２の記録位置まで記録すると共に、前記次のデータセットが分割されていることを示す情報を前記記憶装置の第１の記録位置に記録し、続いて前記次のデータセットの残りを記録することを特徴とする請求項７又は８記載の記録装置。
【請求項１０】
前記データセットは前記データセットの先頭を表わす情報と前記データセットの最後尾を表わす情報とを更に含み、
前記第１の記録領域の特定時に、前記前方データ長情報と前記後方データ長情報との比較の結果両者が不一致となり、かつ前記先頭を表わす情報と前記最後尾を表わす情報とが不一致となる箇所を前記第１の記録領域として特定する請求項８記載の記録装置。
【請求項１１】
前記データセットは、前記記憶装置への書き込みのローテーションを示す情報を更に含み、
前記第１の記録領域の特定時に、前記前方データ長情報と前記後方データ長情報との比較の結果両者が不一致となり、かつ前記ローテーションを示す情報と、１つ後方のデータセットのローテーションを示す情報とが不一致となる箇所を前記第１の記録領域として特定することを特徴とする請求項８記載の記録装置。
【請求項１２】
前記次のデータセットの記録時に、別の記憶装置に、前記書き込むデータセットの前方データ長情報及び前記記憶装置の前記第１の記録位置からのオフセットと、次のデータセットを書き込む位置とを記憶することを特徴とする請求項７記載の記録装置。
【請求項１３】
コンピュータに、記録装置にデータを記録させる記録プログラムであって、
前記コンピュータに、
前記記録装置の記憶領域のうちの第１の記録位置から第２の記録位置に向けて、可変長データと、それぞれ該可変長データのデータ長を示し、該可変長データの前方及び後方に記録される前方及び後方データ長情報を含むデータセットを順次記録し、残り記録領域の不足発生に応じて前記第１の記録位置に戻って、前記第１の記録位置から前記第２の記録位置に向けて、記録済のデータを新たなデータセットで上書きした状態において、前記第２の記録位置から前記第１の記録位置に向けて後方データ長情報から求まる前方データ長情報の記録位置に対応する前方データ長情報が存在するデータセットが連続的に発見される第１の記録領域を特定し、
前記第１の記録位置から前記第２の記録位置に向けて、前方データ長情報から求まる後方データ長情報の記録位置に対応する後方データ長情報が存在するデータセットであって、前記第１の記録領域に差し掛からず、前記第１の記録領域に最も近い位置に記録されたデータセットに後続させて、次のデータセットの記録開始位置として利用する、
処理を実行させることを特徴とする記録プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本件は、記録方法、記録装置及び記録プログラムに関する。
【背景技術】
【０００２】
可変長データを記憶装置にシーケンシャルに記録する処理は、各種用途において広く行なわれている。
例えば、プログラムを実行したり装置を動作させる際に、当該プログラムや装置のログ情報が記憶装置に記録される。このようなプログラムや装置の動作ログ情報は、障害発生時の解析を行なう場合などに必須である。【０００３】
このような動作ログのデータは、可変長データ（以下、可変長データを「可変長レコード」と呼ぶこともある）であることが多い。
また、装置のサイズが制限される組み込み機器などでは、動作ログが不揮発メモリに記録される。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００７−１２９３１９号公報
【特許文献２】特開２００４−１１８４０７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
このため、素子寿命の観点から、書き込み頻度が不揮発メモリの特定の領域に偏よることなく、不揮発メモリの記憶領域に可変長データをシーケンシャルに記録することが望ましい。
１つの側面では、本発明は、不揮発記憶装置の記憶領域に可変長データをシーケンシャルに記録させるための技術を提供することを目的とする。
【課題を解決するための手段】
【０００６】
このため、記録装置にデータを記録する記録方法において、処理装置は、前記記録装置の記憶領域のうちの第１の記録位置から第２の記録位置に向けて、可変長データと、それぞれ該可変長データのデータ長を示し、該可変長データの前方及び後方に記録される前方及び後方データ長情報を含むデータセットを順次記録し、残り記録領域の不足発生に応じて前記第１の記録位置に戻って、前記第１の記録位置から前記第２の記録位置に向けて、記録済のデータを新たなデータセットで上書きした状態において、前記第２の記録位置から前記第１の記録位置に向けて後方データ長情報から求まる前方データ長情報の記録位置に対応する前方データ長情報が存在するデータセットが連続的に発見される第１の記録領域を特定し、前記第１の記録位置から前記第２の記録位置に向けて、前方データ長情報から求まる後方データ長情報の記録位置に対応する後方データ長情報が存在するデータセットであって、前記第１の記録領域に差し掛からず、前記第１の記録領域に最も近い位置に記録されたデータセットに後続させて、次のデータセットの記録開始位置として利用する、処理を実行する。【０００７】
また、この記録装置は、記憶領域を有する記録装置であって、前記記録装置の記憶領域のうちの第１の記録位置から第２の記録位置に向けて、可変長データと、それぞれ該可変長データのデータ長を示し、該可変長データの前方及び後方に記録される前方及び後方データ長情報を含むデータセットを順次記録し、残り記録領域の不足発生に応じて前記第１の記録位置に戻って、前記第１の記録位置から前記第２の記録位置に向けて、記録済のデータを新たなデータセットで上書きした状態において、前記第２の記録位置から前記第１の記録位置に向けて後方データ長情報から求まる前方データ長情報の記録位置に対応する前方データ長情報が存在するデータセットが連続的に発見される第１の記録領域を特定し、前記第１の記録位置から前記第２の記録位置に向けて、前方データ長情報から求まる後方データ長情報の記録位置に対応する後方データ長情報が存在するデータセットであって、前記第１の記録領域に差し掛からず、前記第１の記録領域に最も近い位置に記録されたデータセットに後続させて、次のデータセットの記録開始位置として利用する。【０００８】
また、この記録プログラムは、コンピュータに、記録装置にデータを記録させる記録プログラムであって、前記コンピュータに、前記記録装置の記憶領域のうちの第１の記録位置から第２の記録位置に向けて、可変長データと、それぞれ該可変長データのデータ長を示し、該可変長データの前方及び後方に記録される前方及び後方データ長情報を含むデータセットを順次記録し、残り記録領域の不足発生に応じて前記第１の記録位置に戻って、前記第１の記録位置から前記第２の記録位置に向けて、記録済のデータを新たなデータセットで上書きした状態において、前記第２の記録位置から前記第１の記録位置に向けて後方データ長情報から求まる前方データ長情報の記録位置に対応する前方データ長情報が存在するデータセットが連続的に発見される第１の記録領域を特定し、前記第１の記録位置から前記第２の記録位置に向けて、前方データ長情報から求まる後方データ長情報の記録位置に対応する後方データ長情報が存在するデータセットであって、前記第１の記録領域に差し掛からず、前記第１の記録領域に最も近い位置に記録されたデータセットに後続させて、次のデータセットの記録開始位置として利用する、処理を実行させる。
【発明の効果】
【０００９】
上記可変長レコードの記録方法、不揮発記憶装置及び可変長レコード記録プログラムによれば、不揮発記憶装置自体から、新しいデータの書き込み開始位置と、不揮発記憶装置に書き込まれているデータの読み出し開始位置とを特定することができる。このため、不揮発記憶装置の記憶領域に可変長レコードをシーケンシャルに記録させることが可能となる。
【図面の簡単な説明】
【００１０】
【図１】第１実施形態の一例としてのシステム制御部のハードウェア構成を示す模式図である。
【図２】第１実施形態の一例としてのシステム制御部において使用されるレコード構造を示す図である。
【図３】第１実施形態の一例における重複位置情報の使用法を示す図である。
【図４】第１実施形態の一例としてのシステム制御部の機能構成を示す模式図である。
【図５】第１実施形態の一例としての可変長レコード記録部におけるデータの書き込み時の処理を示すフローチャートである。
【図６】第１実施形態の一例としての可変長レコード記録部におけるさまざまなデータの書き込み例を示す図である。
【図７】第１実施形態の一例としての可変長レコード記録部における記憶領域の末尾と先頭をまたいだデータの書き込み時の処理を示す図である。
【図８】第１実施形態の一例としての可変長レコード記録部におけるデータの読み出し時の処理を示すフローチャートである。
【図９】第１実施形態の一例としてのシステム制御部を組み込んだ機器のハードウェア構成を示す模式図である。
【図１０】第２実施形態の一例としてのシステム制御部の構成を示す模式図である。
【図１１】第２実施形態の一例としての可変長レコード記録部におけるデータの書き込み時の処理を示すフローチャートである。
【図１２】前方データ長情報のみを有する可変長レコードの記録方式を示す図である。
【発明を実施するための形態】
【００１１】
以下、図面を参照して本開示に係る実施の形態を説明する。
（１）第１実施形態
以下、図面を参照して、第１実施形態の一例としてのシステム制御部１の構成について説明する。
図１は、第１実施形態の一例としてのシステム制御部１のハードウェア構成を示す模式図である。
【００１２】
システム制御部（記録装置）１は、例えば情報処理装置等であり、ＣＰＵ（Central Processing Unit）５、ＲＡＭ（Random Access Memory）７及び不揮発メモリ９を備える。
ＣＰＵ５は、ＲＡＭ７や不揮発メモリ９からプログラムを読み出し、後述する可変長レコード記録部３としての処理を実行するプロセッサである。
ＲＡＭ（揮発記憶装置）７は、ＣＰＵ５が演算や制御を行なうに際して、種々のデータやプログラムを一時的に格納する揮発メモリである。また、ＲＡＭ７には、可変長レコード記録部３が使用する一時データ（図示なし）も記憶される。
【００１３】
不揮発メモリ（不揮発記憶装置）９は、データを記憶するための記憶領域６１を備える不揮発性の書き込み可能なメモリである。不揮発メモリ９は、例えば、ＥＰＲＯＭ（Erasable Programmable ROM）、ＥＥＰＲＯＭ（Electrically Erasable Programmable ROM）、ＵＶ−ＥＰＲＯＭ（Ultra-Violet Erasable Programmable ROM）などである。しかし、不揮発メモリ９は、フラッシュメモリなど、他の書き込み可能な不揮発メモリでもよい。
【００１４】
以降、不揮発メモリ９に関して、「前方」とは不揮発メモリ９のアドレス値が小さくなる方向を、「後方」とは不揮発メモリ９のアドレス値が大きくなる方向をそれぞれ意味する。また、不揮発メモリ９の先頭とは、不揮発メモリ９の最小アドレス領域を、末尾又は最後尾とは、最大アドレス領域をそれぞれ意味する。
ただし、これに限定されるものではなく、適宜変更して本実施形態を実施可能である。
【００１５】
不揮発メモリ９は、記憶領域６１を有し、記憶領域６１は、先頭にデータ結合フラグ１１５（図４参照）を有する。このデータ結合フラグ１１５は、図７を参照して後述するように、データ結合フラグ設定部４１によって設定される。
可変長レコード記録部３は、ＣＰＵ３で実行されている制御プログラム９３や不図示のオペレーティングシステム（operating system：ＯＳ）からデータを受け取り、このデータを、不揮発メモリ９の記憶領域６１にシーケンシャルに記録する。その際、可変長レコード記録部３は、図２を参照して説明するレコード構造（データセット）１００を使用することにより、データの書き込みが記憶領域６１の特定の部分に偏らないようにまんべんなく記憶する。
【００１６】
図２は、第１実施形態の一例としてのシステム制御部１において使用されるレコード構造（データセット）１００を示す図である。このレコード構造１００を有する可変長データが、可変長レコード記録部３によって不揮発メモリ９の記憶領域６１に記憶される。
図２に示すレコード構造１００は、先頭フラグ１０１、前方データ長（前方データ長情報、データ長１とも呼ぶ）１０３、ローテーションフラグ１０５、重複位置情報１０７、データ部１０９、最後尾フラグ１１１、及び後方データ長１１３（後方データ長情報、データ長２とも呼ぶ）を有する。
【００１７】
以降、レコードとは、このレコード構造１００を有する１単位のデータを指す。
先頭フラグ１０１は、レコード構造１００の先頭を示すフラグであり、本例では例えば値“０”が設定される。先頭フラグ１０１は、例えば、１ビット長である。
前方データ長１０３は、データ部１０９の長さを示す部分であり、ここには、後述する後方データ長１１３と同じ値が設定される。前方データ長１０３は、例えば、７ビット長である。なお、先頭フラグ１０１と前方データ長１０３とで１バイト長を占め、これらを総称して第１ヘッダバイト１２３と呼ぶ。
【００１８】
ローテーションフラグ１０５は、このレコードが、前回のローテーションで書き込まれるレコード（以下、旧レコード又は前回のレコードと呼ぶ）か、今回のローテーションで書き込まれたレコード（以下、新レコード又は今回のレコードと呼ぶ）かの判別に用いられる。ここで、ローテーションとは、記憶領域６１の先頭から末尾までのシーケンシャルな１回の書き込みを指す。ローテーションフラグ１０５は、例えば、１ビット長である。前回のローテーションのレコードと今回のローテーションのレコードとを区別するために、ローテーションフラグ１０５に値“０”と“１”が、ローテーション毎に交互に設定される。
【００１９】
重複位置情報１０７は、図３のように、書き込むデータの位置と旧レコードの前方データ長１０３の位置とが一致し、かつ書き込むデータと旧レコードの前方データ長１０３とが同じ値の場合（以下、この状況を重複という）に、その重複箇所の位置を示す。
図３は、第１実施形態の一例における重複位置情報の使用法を示す図である。図３ではデータバイトを１６進数で表記している。
【００２０】
書き込む新たなデータ部１０９内の１バイトの位置と旧レコードの前方データ長１０３の位置とが一致し、かつこのバイト（以下、重複バイトとも呼ぶ）と旧レコードの前方データ長１０３とが同じ値の場合、後述する重複位置情報生成部４３が、当該重複バイトをビット反転する。
例えば、図３に示す例では、旧レコードの先頭フラグ１０１が“０”、前方データ長１０３が“４”であるため、当該バイトの値が“０ｘ０４”（“０ｘＸＸ”はバイトの１６進数表記であり、Ｘ＝０〜Ｆ）であり、書き込もうとしているデータのデータ部１０９の２バイト目も“０ｘ０４”である。この場合、後述する重複位置情報生成部４３は、新レコードのデータ部１０９の２バイト目の“０ｘ０４”をビット反転させて“０ｘＦＢ”とする。更に、重複位置情報生成部４３は、重複位置情報１０７に、データ部１０９内のビット反転させたバイトの位置（本例では２バイト目）である値“２”を設定する。
【００２１】
なお、厳密には、書き込む新たなデータ部１０９のデータバイトと、旧レコードの第１ヘッダバイト１２３（先頭フラグ１０１＋前方データ長１０３）とが比較されるが、本例では、先頭フラグ１０１に値“０”が設定されるため、前方データ長１０３と考えて差し支えない。このため、バイト位置の一致を、「書き込む新たなデータ部１０９の１バイトの位置と前方データ長１０３の位置とが一致する」と記載する。また、重複バイトと旧レコードの第１ヘッダバイト１２３との値の一致を「重複バイトと旧レコードの前方データ長１０３とが同じ値となる」と記載する。
【００２２】
このようなビット反転を行なうことで、書き込んだデータを後から読み出す際に、前方データ長１０３とデータ部との一致が原因で、新レコードが最新のデータではないと誤って判別されてしまう状況が回避される。更に、ビット反転させたバイトの位置を重複位置情報１０７に記録することで、後からデータを読み出す際に、元のバイト情報に復元することが可能となる。
【００２３】
重複位置情報１０７は、例えば、７ビット長である。なお、ローテーションフラグ１０５と重複位置情報１０７とで１バイト長を占め、これらを総称して第２ヘッダバイト１２５と呼ぶ。更に、第１ヘッダバイト１２３と第２ヘッダバイト１２５とをまとめてヘッダ部１２１と呼ぶ。
データ部１０９は、データの内容を格納する可変長部分である。データ部１０９は、例えば、１〜１２７バイト長である。
【００２４】
最後尾フラグ１１１は、データの終わりであることを示すフラグであり、先頭フラグ１０１とは異なる値、例えば値“１”が設定される。最後尾フラグ１１１は、例えば、１ビット長である。このフラグは、図６の例（６）を用いて後述するように、旧レコードの前方データ長１０３と新レコードの後方データ長１１３との位置が重なっている場合に、新旧データ境界の判定誤りを防ぐために使用される。
【００２５】
後方データ長１１３は、データ部１０９の長さを示す部分であり、ここには、前述の前方データ長１０３と同じ値が設定される。後方データ長１１３は、例えば、７ビット長である。なお、最後尾フラグ１１１と後方データ長１１３とで１バイト長を占め、これらを総称してフッタ部１２７と呼ぶ。
本実施形態においては、新しいデータを書き込む位置を特定するために、図２に示すように、データの先頭にデータ長情報を前方データ長１０３として設けるほか、データの後方にも後方データ長１１３を配置している。
【００２６】
なお、図２に例示するデータ構造１００の最小長は、データ部１０９の長さが１バイトの場合の４バイトである。
可変長レコード記録部３は、記憶領域６１にデータを、このレコード構造１００の単位で書き込む。また、可変長レコード記録部３は、図４に示すように、例えば不揮発メモリ９の記憶領域６１の先頭１バイトに、データ結合フラグ１１５を記憶する。例えば、データ結合フラグ１１５自体は１ビットの情報であり、残りの７ビットに“０”がパディングされる。
【００２７】
このデータ結合フラグ１１５は、記憶領域６１の末尾の残り領域にデータが入りきらないため、データが二分割されて、記憶領域６１の末尾と先頭とにまたがって記憶されていることを示すフラグである。データがまたがって記憶されている場合は、データ結合フラグ１１５に値“１”が設定される。なお、可変長レコード記録部３は、分割したデータのそれぞれにヘッダ部１２１及びフッタ部１２７を付加して２つのレコードを生成し、記憶領域６１の末尾と先頭とにそれぞれ書き込む。この分割処理については、図７を用いて後述する。
【００２８】
図４は、第１実施形態の一例としてのシステム制御部１の機能構成を示す模式図である。
図４に示すように、ＲＡＭ７は、上書き位置記憶部５１、一時レコード記憶部５３及びローテーションフラグ記憶部５５を有する。
上書き位置記憶部５１は、後述する上書き位置を記憶する領域である。
【００２９】
一時レコード記憶部５３は、データを不揮発メモリ９の記憶部６１に書き込む際に一時的に使用される領域である。
ローテーションフラグ記憶部５５は、ローテーションフラグ１０７（図２参照）に設定する値を記憶する領域である。
ＣＰＵ５は、ＲＡＭ７等に記憶されている不図示の可変長レコード記録プログラムを実行することにより、可変長レコード記録部３を実現する処理装置である。
【００３０】
可変長レコード記録部３は、最古レコード特定部１１、最新レコード特定部１３、書き込み部１５、及び読み出し部１７を有する。
最古レコード特定部１１は、不揮発メモリ９の記憶領域６１を最後尾（第２の記録位置；末尾）から先頭（第１の記録位置）に向けて前方に辿り、記憶領域６１に記憶されているレコードのうち、読み出し可能な最古のレコードを特定する。最古レコード特定部１１は、後方データ長１１３に基づいて前方データ長１０３を読み出し、前方データ長１０３と後方データ長１１３との値の不一致から、最新のレコードと最も古いレコードとの境界（以下、この境界を、第１の記録領域、又はデータ境界位置、又は上書き位置とも呼ぶ）の位置を特定する。
【００３１】
最古レコード特定部１１は、レコード走査部２１、データ長取得部２３、データ長比較部２５、ローテーションフラグ比較部２７及び先頭／最後尾フラグ判定部２９を有する。
レコード走査部２１は、不揮発メモリ９の記憶領域６１の末尾から前方に向かって順にレコードを１つずつ辿り、後方データ長１１３を読み出す。例えば、レコード走査部２１は、次の（１つ古い）レコードに移動する際に、記憶領域６１の（読み出した後方データ長１１３の値＋３）バイト前方の領域を、次のレコードの後方データ長１１３の値として読み出す。
【００３２】
データ長取得部２３は、レコード走査部２１が読み出した後方データ長１１３に基づいて前方データ長１０３を読み出す。例えば、データ長取得部２３は、記憶領域６１の（レコード走査部２１が読み出した後方データ長１１３の値＋１）バイト前方の領域を、前方データ長１０３として読み出す。
データ長比較部２５は、レコード走査部２１が読み出した前方データ長１０３と後方データ長１１３とを比較して、両者が一致するかどうかを比較し、前方データ長１０３と後方データ長１１３とが一致しない場合、そのレコード位置を、ＲＡＭ７の上書き位置記憶部５１に記憶する。
【００３３】
ローテーションフラグ比較部２７は、レコード走査部２１が読み出しているレコードのローテーションフラグ１０７と、その前の（１つ新しい）レコードのローテーションフラグ１０７とを比較する。この処理の詳細は、図６の例（３）を用いて後述する。
先頭／最後尾フラグ判定部２９は、前方データ長１０３の前の先頭フラグ１０１や、後方データ長１１３の前の最後尾フラグ１１１の値が“０”か“１”であるかを判定する。
【００３４】
最新レコード特定部１３は、不揮発メモリ９の記憶領域６１を先頭から辿り、記憶領域６１に記憶されているレコードのうち、最も新しい最新レコードの位置を特定する。
最新レコード特定部１３は、前方データ長１０３に基づいて、最古レコード特定部１１が特定したデータ境界位置（上書き位置）まで、記憶領域６１の前方から後方に辿り、次にデータの書き込みを行なう位置（次のデータセットの記録開始位置；第２の記録領域）を特定する。
【００３５】
最新レコード特定部１３は、レコード走査部３１、データ長取得部３３、及び最新レコード位置特定部３５を有する。
レコード走査部３１は、不揮発メモリ９の記憶領域６１の先頭から後方に向かって順にレコードを１つずつ辿り、前方データ長１０３を読み出す。例えば、レコード走査部３１は、次の（１つ新しい）レコードに移動する際に、記憶領域６１の（読み出した前方データ長１０３の値＋３）バイト後方の領域を、次のレコードの前方データ長１０３の値として読み出す。
【００３６】
データ長取得部３３は、レコード走査部３１が読み出した前方データ長１０３に基づいて後方データ長１１３を読み出す。例えば、データ長取得部３３は、記憶領域６１の（レコード走査部３１が読み出した前方データ長１０３の値＋１）バイト後方の領域を、後方データ長１１３として読み出す。
最新レコード位置特定部３５は、レコード走査部３１が読み出した前方データ長１０３、データ長取得部３３が読み出した後方データ長１１３、及びＲＡＭ７の上書き位置記憶部５１に記憶されている値を比較して、前方データ長１０３と後方データ長１１３との間に、ＲＡＭ７の上書き位置記憶部５１に記憶されている上書き位置が入っているかどうかを判定する。
【００３７】
書き込み部１５は、不揮発メモリ９の記憶領域６１へのレコードの書き込みを行なう。詳細には、書き込み部１５は、ＲＡＭ７の一時レコード記憶部５３に一時レコードを生成し、レコードの生成が終了したら一時レコード記憶部５３から記憶領域６１にデータを転送する。
書き込み部１５は、データ結合フラグ設定部４１、重複位置情報生成部４３、ローテーションフラグ設定部４５、及びレコード転送部４７を有する。
【００３８】
データ結合フラグ設定部４１は、図７に示すように、記憶領域６１の末尾にデータが入りきらない場合に、データを二分割すると共に、データ結合フラグ１１５（図３参照）に値“１”を設定する。
重複位置情報生成部４３は、前述のように、書き込む新たなデータ部１０９内の１バイトの位置と旧レコードの前方データ長１０３の位置とが一致し（重複し）、かつ新データと旧レコードの前方データ長１０３とが同じ値の場合、当該重複バイトをビット反転させる。また、重複位置情報生成部４３は、データ部１０９の先頭を基準とした、データ部１０９中のビット反転させたバイトの位置を、重複位置情報１０７に記録する。
【００３９】
例えば、前述の如く、図３に示す例では、旧レコードの先頭フラグ１０１が“０”、前方データ長１０３が“４”であるため、第１ヘッダバイト１２３の値が“０ｘ０４”であり、書き込もうとしているデータのデータ部１０９の２バイト目も“０ｘ０４”である。この場合、後述する重複位置情報生成部４３は、データ部１０９の２バイト目の“０ｘ０４”をビット反転させて“０ｘＦＢ”とする。更に、重複位置情報生成部４３は、重複位置情報１０７に、データ部１０９内のビット反転させたバイトの位置（本例では２バイト目）である値“２”を設定する。
【００４０】
ローテーションフラグ設定部４５は、ＲＡＭ７のローテーションフラグ記憶部５５に記憶されているローテーションフラグの値を、書き込むデータのローテーションフラグ１０７に設定する。また、ローテーションフラグ設定部４５は、例えば、書き込み位置が記憶領域６１の先頭に戻った際に、ＲＡＭ７のローテーションフラグ記憶部５５の値を反転させる。
【００４１】
レコード転送部４７は、書き込むデータを制御プログラム９３や不図示のＯＳから受け取り、このデータに基づいて、レコード構造１００を生成し、一時レコード記憶部５３に記憶する。更にレコード転送部４７は、データ結合フラグ設定部４１、重複位置情報生成部４３、及びローテーションフラグ設定部４５の処理が完了し、一時レコード記憶部５３内の一時レコードが完成すると、これを記憶領域６１に転送する。
【００４２】
読み出し部１７は、記憶領域６１に書き込まれているレコードを古い順から読み出す。
次に、第１実施形態の一例としての可変長レコード記録部３におけるデータの書き込み時の処理を説明する。
図５は、第１実施形態の一例としての可変長レコード記録部３におけるデータの書き込み時の処理を示すフローチャートである。
【００４３】
この書き込みは、例えば、ＣＰＵ５で実行されている制御プログラム９３から不揮発メモリ９の記憶領域６１にデータ（ログデータなど）を書き込む際に行なわれる。
ステップＳ１において、不揮発メモリ９の記憶領域６１の末尾のレコードに移動する。
ステップＳ３において、データ長取得部２３は、レコード走査部２１は、カレントレコードの後方データ長１１３を読み出す。
【００４４】
ステップＳ５において、データ長取得部２３は、ステップＳ３で読み出した後方データ長１１３に基づいて、レコードの前方データ長１０３を読み出す。
ステップＳ９において、データ長比較部２５は、ステップＳ３で読み出した後方データ長１１３と、ステップＳ５で読み出した前方データ長１０３とが等しいかどうかを判定する。
【００４５】
ステップＳ９で後方データ長１１３と前方データ長１０３とが等しい場合（ステップＳ９のＹＥＳルート参照）、ステップＳ１１において、ローテーションフラグ比較部２７は、レコード走査部２１が読み出したカレントのレコードとその前の（１つ新しい）レコードのローテーションフラグ１０７同士が一致するか判定する。
ステップＳ１１でローテーションフラグ１０７が一致しない場合（ステップＳ１１のＮＯルート参照）、ステップＳ１３において、先頭／最後尾フラグ判定部２９は、前方データ長１０３の前の先頭ビット１０１の値が“０”に設定されているかどうかを判定する。
【００４６】
ステップＳ１３で前方データ長１０３の前の先頭ビット１０１の値が“０”の場合（ステップＳ１３のＹＥＳルート参照）、ステップＳ１５において、データ長比較部２５は、後方データ長１１３と前方データ長１０３とが不一致のレコードを、最新レコードの存在する位置と判断する。つまり、この位置で最新のレコードが書き込まれたことにより、旧レコードの前方データ長１０３が上書きされて、前方データ長１０３と後方データ長１１３の値とが一致しなくなっている。このため、データ長比較部２５は、直前に前方データ長１０３と後方データ長１１３が一致していたレコードが、最も古いレコードであると判定する。
【００４７】
また、データ長比較部２５は、前方データ長１０３と後方データ長１１３の値が一致しない最新レコード（以下、上書き位置と呼ぶこともある）の位置を、ＲＡＭ７の上書き位置記憶部５１に記憶する。この位置は、最新レコード特定部１３による前方からの検索で使用される。
一方、ステップＳ９において、ステップＳ３で読み出した後方データ長１１３と、ステップＳ５で読み出した前方データ長１０３とが不一致の場合（ステップＳ９のＮＯルート参照）、処理がステップＳ１５に移る。
【００４８】
また、ステップＳ１１でローテーションフラグ１０７が一致する場合（ステップＳ１１のＹＥＳルート参照）、処理がステップＳ７に移る。
ステップＳ１３で前方データ長１０３の前の先頭ビット１０１の値が“０”ではない場合（ステップＳ１３のＮＯルート参照）、ステップＳ７において、レコード走査部２１は、不揮発メモリ９の記憶領域６１の１つ前のレコード（次に古い）レコードに移り、その後方データ長１１３を読み出す。
【００４９】
ステップＳ１５に達するまで、上記ステップＳ３〜ステップＳ１３の処理を繰り返す。
次に、ステップＳ１７において、レコード走査部３１は、不揮発メモリ９の記憶領域６１の先頭のレコードに移動してその前方データ長１０３を読み出す。
次に、ステップＳ１９において、データ長取得部３３は、ステップＳ１７で読み出した前方データ長１０３に基づいて、そのレコードの後方データ長１１３を読み出す。
【００５０】
次に、ステップＳ２１において、最新レコード位置特定部３５は、ステップＳ１７で読み出した前方データ長１０３と、ステップ８で読み出した後方データ長１１３との間に、上書き位置記憶部５１に記憶させた位置（上書き位置）が含まれるかどうかを判定する。
前方データ長１０３と後方データ長１１３との間に上書き位置が含まれない場合（ステップＳ２１のＮＯルート参照）は、記憶領域６１の前方読み出しにおいて、上書き位置をまだ通過していない。このため、ステップＳ２３において、レコード走査部３１は、１つ後ろのレコード（新しいレコード）に移動して、そのレコードの前方データ長１０３を読み出す。
【００５１】
ステップＳ２１の判定において、前方データ長１０３と後方データ長１１３との間に上書き位置が含まれるまで、上記ステップＳ１９〜ステップＳ２３の処理を繰り返す。
ステップＳ２１の判定において前方データ長１０３と後方データ長１１３との間に上書き位置が含まれる場合（ステップＳ２１のＹＥＳルート参照）、処理が書き込み処理に移る。カレントレコードが最新のレコードとなり、次の書き込み位置は、最新レコードの次の位置となる。
【００５２】
ステップＳ２５において、次に書き込むデータ部１０９内の１バイトのバイトの位置と、最も古いレコードの前方データ長１０３の位置とが一致し、かつ両者の値が一致するかどうかを判定する。例えば、図３の例では、書き込もうとしているデータ（データ部１０９）の２バイト目（値“０ｘ０４”）の位置と、旧データの前方データ長１０３（値“４”）の位置とが一致し、かつ両者が同じ値である。
【００５３】
次に書き込むレコードのデータ部１０９内の１バイトの位置と、最も古いレコードの前方データ長１０３の位置とが一致し、かつ両者の値が一致する場合（ステップＳ２５のＹＥＳルート参照）、ステップＳ２７において、重複位置情報生成部４３は、重複位置のデータをビット反転する。更に、重複位置情報生成部４３は、ビット反転させた位置（レコード内のデータ部の先頭バイトを１とした相対位置）を、ＲＡＭ７の一時レコード記憶部５３の重複位置情報１０７に設定する。
【００５４】
例えば、前述のごとく、図３の例では、重複位置情報生成部４３は、書き込むデータの２バイト目の“０ｘ０４“をビット反転させた“０ｘＦＢ”を、ＲＡＭ７の一時レコード記憶部５３のデータ部１０９の２バイト目に書き込む。更に、重複位置情報生成部４３は、一時レコード記憶部５３の重複位置情報１０７に、ビット反転させたバイト位置の“２”を書き込む。
【００５５】
一方、次に書き込むレコードのデータ部１０９内の１バイトの位置と、最も古いレコードの前方データ長１０３の位置とが一致しないか、あるいは一致しても両者の値が異なる場合（ステップＳ２５のＮＯルート参照）、処理はステップＳ２９に移る。
最後に、ステップＳ２９において、レコード転送部４７は、前方データ長１０３、後方データ長１１３、ローテーションフラグ１０５をＲＡＭ７の一時レコード記憶部５３に書き込む。そして、レコードを、不揮発メモリ９の記憶領域６１の書き込み位置に転送し、不揮発メモリ９へのレコードの書き込みを行なう。
【００５６】
次に、図６を参照して、可変長レコード記録部３におけるさまざまなデータの書き込み例を更に詳しく説明する。
図６は、第１実施形態の一例としての可変長レコード記録部３におけるさまざまなデータの書き込み例を示す図である。
なお、図６中、破線の矢印は不揮発メモリ９の記憶領域６１への最初一巡目の書き込みを示し、実線の矢印は二巡目の書き込みを示す。また、左斜め下向きの斜線の部分は第１ヘッダバイト１２３を示す。横線の部分は、第２ヘッダバイト１２５を示す。更に、右斜め下向きの斜線部分は、フッタ部１２７を示す。また、図６ではデータバイトを１６進数で表記している。
【００５７】
図６の例（１）は、記憶領域６１に初めて（一巡目の）データを記録する際の処理を示す。
まず、ローテーションフラグ設定部４５が、ＲＡＭ７のローテーションフラグ記憶部５５に値“０”を設定する。
次に、記憶領域６１に、データ結合フラグ１１５、レコードａ、レコードｂ、レコードｃ、レコードｄが順に書き込まれる。データ部１０９の長さがレコードａは３バイト、レコードｂは４バイト、レコードｃは２バイト、レコードｄは１バイトである。その際、レコードａ〜ｄのローテーションフラグ１０５には、ＲＡＭ７のローテーションフラグ記憶部５５に記憶されている値“０”が書き込まれ、重複位置情報１０７は、重複位置が存在しないため値“０”が書き込まれる。このため、第２ヘッダバイト１２５の値が“０ｘ００”となる。また、レコードのフッタ部１２７には、“０ｘ８３”、“０ｘ８４”、“０ｘ８２”及び“０ｘ８２”がそれぞれ書き込まれる。
【００５８】
レコードｄを記録すると、記憶領域６１の末尾に達する。このため、次の例（２）では、ローテーションフラグ記憶部５５が、ローテーションの入れ替わりを示すために、ＲＡＭ７のローテーションフラグ記憶部５５に記憶されている値“０”を反転させた値“１”をセットする。そして、例（２）に示すように、記憶領域６１のデータ結合フラグ１１５の直後に、データ部１０９の長さが１の新レコードｅが書き込まれる。
【００５９】
その際、レコードｅのローテーションフラグ１０５には、ローテーションフラグ記憶部５５に記憶されている値“１”が書き込まれ、重複位置情報１０７には、重複位置が存在しないため値“０”が書き込まれる。このため、第２ヘッダバイト１２５の値が“０ｘ８０”となる。
その後、最古レコード特定部１１は、左向きの矢印で示すように、記憶領域６１の末尾からレコードを前方に辿っていく。データ長比較部２５が、上書きされたレコードａの後方データ長１１３の値“３”と、レコードｅの前方データ長１０３の値“１”とが不一致であるため、新旧のデータの境目がこの周辺に存在すると判定する。
【００６０】
次の例（３）では、記憶領域６１のデータ結合フラグ１１５の直後に、データ部１０９の長さが２の新レコードｅが書き込まれる。
その際、レコードｅのローテーションフラグ１０５には、ローテーションフラグ記憶部５５に記憶されている値“１”が書き込まれ、重複位置情報１０７には、重複位置が存在しないため値“０”が書き込まれる。このため、第２ヘッダバイト１２５の値が“０ｘ８０”となる。
【００６１】
その後、最古レコード特定部１１は、左向きの矢印で示すように、記憶領域６１の末尾からレコードを前方に辿っていく。データ長比較部２５が、上書きされたレコードａの後方データ長１１３の値“３”と、レコードｅの後方データ長１１３の値“２”とが不一致であるため、新旧のデータの境目がこの周辺に存在すると判定する。
次の例（４）は、古いレコードの前方データ長１０３と新しいレコードの前方データ長１０３の位置が重なっている別のケースである。例（４）に示すように、記憶領域６１のデータ結合フラグ１１５の直後に、データ部１０９の長さが３の新レコードｅが書き込まれる。
【００６２】
その際、レコードｅのローテーションフラグ１０５には、ローテーションフラグ記憶部５５に記憶されている値“１”が書き込まれ、重複位置情報１０７には、重複位置が存在しないため値“０”が書き込まれる。このため、第２ヘッダバイト１２５の値が“０ｘ８０”となる。
その後、最古レコード特定部１１は、左向きの矢印で示すように、記憶領域６１の末尾からレコードを前方に辿っていく。データ長比較部２５が、上書きされたレコードａの後方データ長１１３の値“３”と、レコードｅの後方データ長１１３の値“３”とが一致すると判定する。しかし、×で示すように、レコードａより１つ新しいレコードｂのローテーションフラグ１０５の値“０”と、レコードｅのローテーションフラグ１０５の値“１”とが一致しない。このため、新旧のデータの境目がこの部分に存在すると判定される。このように、新旧のデータの前方データ長１０３と後方データ長１１３とが一致する場合であっても、ローテーションフラグ比較部２７がローテーションフラグを比較することにより、レコードｂの方が古いデータであることを判別することができる。
【００６３】
次の例（５）は、古いレコードの前方データ長１０３と新しいレコードの後方データ長１１３の位置が重なっているケースである。例（５）に示すように、記憶領域６１のデータ結合フラグ１１５の直後に、データ部１０９の長さが４の新レコードｅが書き込まれる。
その際、レコードｅのローテーションフラグ１０５には、ローテーションフラグ記憶部５５に記憶されている値“１”が書き込まれ、重複位置情報１０７には、重複位置が存在しないため値“０”が書き込まれる。このため、第２ヘッダバイト１２５の値が“０ｘ８０”となる。
【００６４】
その後、最古レコード特定部１１は、左向きの矢印で示すように、記憶領域６１の末尾からレコードを前方に辿っていく。データ長比較部２５が、レコードｅの後方データ長１１３の値を、前方データ長１０３であると誤って認識し、後方データ長１１３の値“４”が上書きされたレコードｂの後方データ長１１３の値“４”と一致すると判定してしまう。
【００６５】
しかし、先頭／最後尾フラグ判定部２９が、上書きされたレコードｂの後方データ長１１３の値“４”の１つ前のフラグの値が“１”であり、比較したのが前方データ長１０３ではなく後方データ長１１３であると判定するので、新旧データの境界がこの周辺に存在すると判断する。
次の例（６）は、新しいレコードのデータ部１０９内の１バイト（５バイト目）の位置と、旧レコードの前方データ長１０３の位置とが一致するが、書き込むデータバイトと旧レコードの前方データ長１０３との値が一致しないケースである。例（６）に示すように、記憶領域６１のデータ結合フラグ１１５の直後に、データ部１０９の長さが２の新レコードｅが書き込まれる。
【００６６】
その際、レコードｅのローテーションフラグ１０５には、ローテーションフラグ記憶部５５に記憶されている値“１”が書き込まれ、重複位置情報１０７には、重複位置が存在しないため値“０”が書き込まれる。このため、第２ヘッダバイト１２５の値が“０ｘ８０”となる。
その後、最古レコード特定部１１は、左向きの矢印で示すように、記憶領域６１の末尾からレコードを前方に辿っていく。データ長比較部２５が、上書きされたレコードｂの後方データ長１１３の値と、レコードｅのデータ部のデータとが不一致の場合、レコードｂが無効であり、ここに新旧データの境界が存在すると判断できる。
【００６７】
次の例（７）は、新しいレコードのデータ部１０９内の１バイト（５バイト目）の位置と、旧レコードの前方データ長１０３の位置とが一致し、かつ書き込むバイトと旧レコードの前方データ長１０３との値が一致するケースである。例（７）に示すように、記憶領域６１のデータ結合フラグ１１５の直後に、データ部１０９の長さが２の新レコードｅが書き込まれる。
【００６８】
その際、レコードｅのローテーションフラグ１０５には、ローテーションフラグ記憶部５５に記憶されている値“１”が書き込まれる。しかし、図３を参照して説明したように、書き込むデータと旧レコードの前方データ長１０３とが一致するため、当該バイトを反転させる。その結果、重複位置情報１０７には、反転させたバイトの位置“５”が書き込まれる。このため、第２ヘッダバイト１２５の値が“０ｘ８５”となる。
【００６９】
その後、最古レコード特定部１１は、左向きの矢印で示すように、記憶領域６１の末尾からレコードを前方に辿っていく。データ長比較部２５が、上書きされたレコードｂの後方データ長１１３の値と、レコードｅのデータ部のデータとが一致する。この場合、図中のデータ部１０９の５バイト目の値が“０ｘ０４”である場合、この値が、前回書き込み時の前方データ長１０３と同じ値となり、当該箇所がデータバイトか前方データ長１０３かが判断できなくなる。このため、該当箇所のデータをビット反転させて“０ｘＦＢ”とし、更にその反転させたバイト位置を重複位置情報１０７に記録する。
【００７０】
次の例（８）は、古いレコードの前方データ長１０３の位置と新しいレコードの重複位置情報１０７の位置とが重なっているケースである。例（８）に示すように、記憶領域６１のデータ結合フラグ１１５の直後に後方データ長１１３の新レコードｅが書き込まれ、続いてデータ部１０９の長さが３の新レコードｆが書き込まれる。
この例（８）では、古いデータのデータ長がレコードｆの重複位置情報１０７により上書きされる。重複位置情報１０７が“０”であり、後方データ長１１３と一致せず、更に値“０”はデータ長として無効な値であるため、新旧データの境界がこの付近に存在すると判別できる。
【００７１】
次に、図７を参照して、不揮発メモリ９の記憶領域６１の末尾をまたいでデータを書き込む方法について説明する。
図７も同様に、破線の矢印は不揮発メモリ９の記憶領域６１への最初一巡目の書き込みを示し、実線の矢印は二巡目の書き込みを示す。また、左斜め下向きの斜線の部分は第１ヘッダバイト１２３を示す。横線の部分は、第２ヘッダバイト１２５を示す。更に、右斜め下向きの斜線部分は、フッタ部１２７を示す。また、図６ではデータバイトを１６進数で表記している。
【００７２】
図７の例（９）に示すように、記憶領域６１の残りの領域よりも、書き込むデータの方が大きい場合、可変長レコード記録部３は、データを記憶領域６１に均一かつまんべんなく書き込むために、データを分割して記録する。
詳細には、書き込むデータのサイズ、ヘッダ部１２１及びフッタ部１２７の合計サイズが、記憶領域６１の残りの容量を超える場合、データ結合フラグ設定部４１が、書き込むデータを分割する。その際、記憶領域６１の末尾に記録させるデータ部１０９のサイズは以下の式
（記憶領域６１の残り容量）−（ヘッダ部１２１のサイズ＋フッタ部１２７のサイズ）
で求められる。このサイズでデータを分割し、データ部１０９とし、ヘッダ部１２１及びフッタ部１２７を付加してレコードを書き込む。
【００７３】
そして、残りのデータを、記憶領域６１の先頭から、同様に、ヘッダ部１２１及びフッタ部１２７を付加して記録する。
その際、末尾のレコードと先頭のレコードとは、元は一つのデータであったことを示すために、記憶領域６１の先頭のデータ結合フラグ１１５に、例えば値“１”を設定する。なお、データ結合フラグ１１５のサイズが１ビットである場合、データ結合フラグ設定部４１は、バイト境界に合わせるために、記憶領域６１の先頭バイトの残りの７ビットに、例えば“０”をパディングする。
【００７４】
このように処理を行なうことで、読み出しの際に、データ結合フラグ設定部４１を参照することで、２つに分割されたレコードを１つのデータとして復元することができる。
本実施形態においては、最小のレコードサイズは、ヘッダ部１２１、データ部１０９、及びフッタ部１２７を合計したサイズ（例えば、図２の例では４バイト）となる。このため、記憶領域６１の残り領域がこのサイズより小さい場合には、この残った領域を“０”で埋めておく。
【００７５】
データを記憶領域６１の最後から読み出す際に、レコードの最後は必ず「後方データ長１１３」となるため、“０”のシーケンスとはならない。このため、記憶領域６１の最後の“０”のシーケンスの領域をスキップすることで、末尾のレコードの後方データ長１１３を検出することができる。
次に、上記のように不揮発メモリ９の記憶領域６１に記録したデータを読み出す際の処理について説明する。
【００７６】
データの読み出し時には、図８のフローチャートのステップＳ１〜Ｓ２３を実行し、最も古いレコードの位置と最新レコードの位置を特定する。
これらの処理は、図５のフローチャートのステップＳ１〜Ｓ２３と同じであるので、その説明は省略する。
ステップＳ２１に続いて、ステップＳ３１において、読み出し部１７は、最も古いレコードから順にレコードを読み出す。
【００７７】
ステップＳ３３において、読み出し部１７は、記憶領域６１の末尾に達したかどうかを判定する。
記憶領域６１の末尾に達していない場合（ステップＳ３３のＮＯルート参照）、ステップＳ３５において、読み出し部１７は、１つ前の（次に古い）レコードを読み出す。
記憶領域６１の末尾に達するまで、上記ステップＳ３３，Ｓ３５の処理を繰り返す。
【００７８】
記憶領域６１の末尾に達した場合（ステップＳ３３のＹＥＳルート参照）場合、ステップＳ３７において、読み出し部１７は、記憶領域６１の先頭のレコードを読み出す。
ステップＳ３９において、読み出し部１７は、最新レコードに達したかどうかを判定する。
最新レコードに達していない場合（ステップＳ３９のＮＯルート参照）、ステップＳ４１において、読み出し部１７は、１つ前の（次に古い）レコードを読み出す。
【００７９】
最新レコードに達した場合（ステップＳ３９のＹＥＳルート参照）、読み出し処理を終了する。
このように、記憶領域６１の末尾のレコードから前方にデータを読み出し、次に記憶領域６１の先頭に移動して、先頭のレコードから最新レコードの順に後方にレコードを読み出すことにより、読み出し部１７は、データが書き込まれた順にデータを読み出すことができる。
【００８０】
図９は、第１実施形態の一例としてのシステム制御部１を搭載した機器１のハードウェア構成を示す模式図である。
システム制御部１は、制御対象９７に対して何らかの制御を行なう。例えば、システム制御部１がサーバ筐体内のシステムボードに搭載されるサービスプロセッサの場合には、制御対象９７はサーバ本体などである。
【００８１】
システム制御部１は、可変長レコード記録部３と、制御対象９７を実際に制御するための制御プログラム９３とを有する。
システム制御部１は、システム制御部１の可変長レコード記録部３が、制御に係る動作ログや制御対象９７の異常ログを不揮発メモリ９の記憶領域６１に記憶する。その際、可変長レコード記録部３は、図２に示したレコード構造１００を用いてログデータの書き込みを行なう。
【００８２】
本実施形態との比較のために、前方データ長情報のみを有する可変長レコードを、記憶領域にシーケンシャルに繰り返し記録する手法の一例を図１２に示す。
この手法では、可変長データの前に当該データの長さを示すヘッダ情報を付加することで、記憶領域へのデータの書き込み開始位置（以下、上書き位置とも呼ぶ）と、記憶領域に既に書き込まれているデータ読み出し開始位置とを管理する。図１２の（１）では、データＡ、データＢ、データＣ、データＤの順に、記憶領域の先頭から末尾に向かってデータが書き込まれる。更に、これらの可変長データＡ〜Ｄの前に、データ部分の長さを示すヘッダ情報がそれぞれ付加される。
【００８３】
その後、図１２の（２）に示すように、データＤの後にデータＥが書き込まれる。記憶領域の末尾までデータＥの一部を書き込んだのち、記憶領域の先頭に戻り、データＥの残りが書き込まれる。
この場合、記憶領域の先頭に記録されていたデータＡがデータＥによって上書きされるため、読み出し可能な最も古いデータはデータＢとなる。このため、データの読み出し開始位置を、データＢの先頭（すなわち、データＢのヘッダ情報）と認識しなければならない。その後更に、図１２の（３）に示すように、データＥの後にデータＦが書き込まれる。
【００８４】
しかし、この手法では、データの先頭にしかヘッダ情報がない。このため、図１２の（２），（３）に示すように、記憶領域の先頭に戻ってデータＡのヘッダ部分が上書きされてしまうと、読み出し可能な最も古いレコードの位置がどこか分からなくなってしまう。
このような事態を回避するために、データの書き込み開始位置と読み出し開始位置とを不揮発記憶領域内に設けることも考えられる。しかし、不揮発記憶領域内にデータの書き込み開始位置と読み出し開始位置とを設けると、これらを記憶している位置の書き込み頻度が高くなり、不揮発記憶領域の素子寿命が低下する。
【００８５】
これに対して、本実施形態においては、データ部１０９の前と後の両方にデータ長情報１０３，１１３を付加するので、不揮発メモリ９自体から、新しいデータの書き込み開始位置と、記憶領域に書き込まれているデータの読み出し開始位置とを特定することができる。データの書き込み開始位置と読み出し開始位置とを不揮発メモリ９に記憶させる必要がなく、不揮発メモリ９の書き込み頻度が特定の領域に偏よらずに、不揮発メモリ９の全領域にわたって可変長レコード１００をまんべんなく記録させることができる。
【００８６】
また、書き込もうとしているデータ部１０９内の１ビットの位置が、旧レコードの前方データ長１０３の位置と一致する場合に、当該重複バイトをビット反転させ、ビット反転させた位置を重複位置情報１０７に記憶する。これにより、後からこの新データを読み出す際に、前方データ長１０３とデータ部１０９の当該バイトとの一致が原因で、新レコードが最新のデータではないと誤って判別されてしまうことが回避される。更に、ビット反転させたバイトの位置を重複位置情報１０７に記録することで、後からデータを読み出す際に、元の情報に復元することが可能となる。
【００８７】
更に、先頭フラグ１０１、ローテーションフラグ１０５及び最後尾フラグ１１１を設けているので、前方データ長１０３や後方データ長１１３と、他の情報との混同を防ぐことができる。
また、データ結合フラグ１１５を用いてデータを分割することにより、記憶領域６１の末尾までデータを詰めることができるので、データを更に偏りなく記憶させることができる。
（２）第２実施形態
上記第１実施形態においては、１レコードを書き込む都度、前方データ長１０３と後方データ長１１３とが不一致となる箇所を検索する処理が必要となる。
【００８８】
そこで、第２実施形態の一例では、処理の高速化を図るために、図１０に示すように、次レコード書き込み位置７１と前方データ長配置情報７３，７５を、ＲＡＭ７などの揮発領域に記録することにより、新旧レコードの区切り位置の検索を省略する。
以下、第２実施形態の一例に係るシステム制御部１′について説明する。
図１０は、本実施形態の一例としてのシステム制御部１′の構成を示す模式図である。
【００８９】
本実施形態のシステム制御部１′は、図１に記載したシステム制御部１の構成に加え、ＲＡＭ７内に、次レコード書き込み位置７１、前回ローテーション用の前方データ長配置情報７３、及び今回ローテーション用の前方データ長配置情報７５を有する。
なお、本実施形態のシステム制御部１′の他の構成については、図１，図４に図示した第１実施形態のシステム制御部１と同様であるため、その説明並びに図示を省略する。
【００９０】
次レコード書き込み位置７１は、記憶領域６１にデータの書き込みを開始するアドレスである。
前回ローテーション用の前方データ長配置情報７３は、前回のローテーションで記憶領域６１に書き込んだ全レコードの各前方データ長１０３のアドレス（オフセット位置）とその値とを記憶する領域である。
【００９１】
今回ローテーション用の前方データ長配置情報７５は、今回のローテーションで記憶領域６１に書き込む全レコードの各前方データ長１０３のアドレス（オフセット位置）とその値とを記憶する領域である。前方データ長配置情報７５は、可変長レコード記録部３によって記憶領域６１へのデータの書き込み時に作成される。可変長レコード記録部３は、記憶領域６１の末尾までレコードを記録すると、今回ローテーション用の前方データ長配置情報７５を、前回ローテーション用の前方データ長配置情報７３に一括転送し、今回ローテーション用の前方データ長配置情報７５をクリアする。
【００９２】
図１１は、第２実施形態の一例としての可変長レコード記録部におけるデータの書き込み時の処理を示すフローチャートである。
次レコード書き込み位置７１、前回ローテーション用の前方データ長配置情報７３、及び今回ローテーション用の前方データ長配置情報７５は、ＲＡＭ７に記憶されているので、システム制御部１′の電源切断時に消去される。このため、システム制御部１′の電源投入後、ステップＳ５１の初期化を行なう。この初期化では、図８のステップＳ１〜Ｓ２３の処理を実行して、不揮発メモリ９の記憶領域６１からデータを読み出す。更に、図８のステップＳ２１で判定を行なったレコードの次のレコード位置を、ＲＡＭ７の次レコード書き込み位置７１に記憶する。更に、記憶領域６１に記憶されている全レコードの前方データ長１０３を順次、今回ローテーション用の前方データ長配置情報７５に記憶する。
【００９３】
初期化が終了したら、ステップＳ５３において、書き込み部１５が、ＲＡＭ７の次レコード書き込み位置７１から書き込み位置を読み出す。
次に、ステップＳ５５において、書き込み部１５は、ＲＡＭ７の今回ローテーション用前方データ長配置情報７５の前方データ長１０３に、最新のレコードを書き込む範囲と重複するものが存在し、かつデータが一致するかどうかをアドレス（オフセット）に基づいて判定する。
【００９４】
ＲＡＭ７の今回ローテーション用前方データ長配置情報７５の前方データ長１０３に、最新のレコードを書き込む範囲と重複するものが存在し、かつデータが一致する場合（ステップＳ５５のＹＥＳルート参照）、ステップＳ５７において、重複位置情報生成部４３は、重なる位置のバイトをビット反転する。更に、重複位置情報生成部４３は、ビット反転させたバイトの位置を重複位置情報１０７に設定する。
【００９５】
ステップＳ５９において、レコードを書き込む。その際、書き込んだレコードの前方データ長１０３を、今回ローテーション用の前方データ長配置情報７５の最後に記憶する。
次に、ステップＳ６１において、書き込み部１５は、ローテーションが行なわれたか、すなわち、書き込みが記憶領域６１の末尾まで行なわれたかを判定する。
ローテーションが行なわれた場合（ステップＳ６１のＹＥＳルート参照）、ステップＳ６３において、書き込み部１５は、今回ローテーション用の前方データ長配置情報７５を前回ローテーション用の前方データ長配置情報７３に一括転送する。その後、今回ローテーション用の前方データ長配置情報７５をクリアする。
【００９６】
一方、ローテーションが行なわれていない場合（ステップＳ６１のＮＯルート参照）、処理がステップＳ６５に移る。
ステップＳ６５において、書き込み部１５は、書き込んだレコードの前方データ長１０３のアドレス（オフセット位置）とその値とを、今回ローテーション用の前方データ長配置情報７５の末尾に追加する。
【００９７】
ステップＳ６７において、書き込み部１５は、次レコード書き込み位置７１を更新する。
このように、本実施形態においては、上記第１実施形態の効果に加えて、書き込み処理の高速化という更なる効果を奏する。
（３）その他
なお、本発明は、上述した各実施形態及び変形例に記載した構成に限定されるものではなく、本発明の趣旨を逸脱しない範囲で種々変形することが可能である。
【００９８】
例えば、図２に示したデータ長は例に過ぎず、システム制御部１が制御する対象や制御プログラム９３、不図示のＯＳのログフォーマットに応じてデータ長を適宜変更することができる。
また、図４に示した各機能ブロック内の機能及び構成は一例に過ぎず、各ブロックの機能の組み合わせを適宜変更してもよい。
【００９９】
また、上記の各実施形態の一例においては、処理フローのステップの実行順序を変更してもよい。
更に、旧データの前方データ長１０３と書き込むデータとの位置の重複を１バイト単位で判定したが、重複を複数バイト単位で判定してもよい。
なお、上記の各実施形態においては、システム制御部１又は１′のＣＰＵ５が、可変長レコード記録プログラムを実行することにより、図４の可変長レコード記録部３、最古レコード特定部１１、最新レコード特定部１３、書き込み部１５、読み出し部１７、レコード走査部２１、データ長取得部２３、データ長比較部２５、ローテーションフラグ比較部２７、先頭／最後尾フラグ判定部２９、レコード走査部３１、データ長取得部３３、最新レコード位置特定部３５、データ結合フラグ設定部４１、重複位置情報生成部４３、ローテーションフラグ設定部４５、及びレコード転送部４７として機能する。
【０１００】
また、システム制御部１又は１′のＲＡＭ７が、上書き位置記憶部５１、一時レコード記憶部５３、ローテーションフラグ記憶部５５、次レコード書き込み位置７１、前回ローテーション用の前方データ長配置情報７３、及び今回ローテーション用の前方データ長配置情報７として機能する。
なお、これらの可変長レコード記録部３、最古レコード特定部１１、最新レコード特定部１３、書き込み部１５、読み出し部１７、レコード走査部２１、データ長取得部２３、データ長比較部２５、ローテーションフラグ比較部２７、先頭／最後尾フラグ判定部２９、レコード走査部３１、データ長取得部３３、最新レコード位置特定部３５、データ結合フラグ設定部４１、重複位置情報生成部４３、ローテーションフラグ設定部４５、及びレコード転送部４７としての機能を実現するための可変長レコード記録プログラム（可変長レコード記録プログラム）は、例えばフレキシブルディスク，ＣＤ（ＣＤ−ＲＯＭ，ＣＤ−Ｒ，ＣＤ−ＲＷ等），ＤＶＤ（ＤＶＤ−ＲＯＭ，ＤＶＤ−ＲＡＭ，ＤＶＤ−Ｒ，ＤＶＤ＋Ｒ，ＤＶＤ−ＲＷ，ＤＶＤ＋ＲＷ，ＨＤ  ＤＶＤ等），ブルーレイディスク，磁気ディスク，光ディスク，光磁気ディスク等の、コンピュータ読取可能な記録媒体に記録された形態で提供される。そして、コンピュータはその記録媒体からプログラムを読み取って内部記憶装置又は外部記憶装置に転送し格納して用いる。又、そのプログラムを、例えば磁気ディスク，光ディスク，光磁気ディスク等の記憶装置（記録媒体）に記録しておき、その記憶装置から通信経路を介してコンピュータに提供するようにしてもよい。
【０１０１】
可変長レコード記録部３、最古レコード特定部１１、最新レコード特定部１３、書き込み部１５、読み出し部１７、レコード走査部２１、データ長取得部２３、データ長比較部２５、ローテーションフラグ比較部２７、先頭／最後尾フラグ判定部２９、レコード走査部３１、データ長取得部３３、最新レコード位置特定部３５、データ結合フラグ設定部４１、重複位置情報生成部４３、ローテーションフラグ設定部４５、及びレコード転送部４７としての機能を実現する際には、内部記憶装置（本実施形態ではシステム制御部１又は１′のＲＡＭ７）に格納されたプログラムがコンピュータのマイクロプロセッサ（本実施形態ではシステム制御部１又は１′のＣＰＵ５）によって実行される。このとき、記録媒体に記録されたプログラムをコンピュータが読み取って実行するようにしてもよい。
【０１０２】
なお、本実施形態において、コンピュータとは、ハードウェアとオペレーティングシステムとを含む概念であり、オペレーティングシステムの制御の下で動作するハードウェアを意味している。又、オペレーティングシステムが不要でアプリケーションプログラム単独でハードウェアを動作させるような場合には、そのハードウェア自体がコンピュータに相当する。ハードウェアは、少なくとも、ＣＰＵ等のマイクロプロセッサと、記録媒体に記録されたコンピュータプログラムを読み取るための手段とを備えており、本実施形態においては、システム制御部１又は１′がコンピュータとしての機能を有している。
【産業上の利用可能性】
【０１０３】
本技術は、可変長ログの記録、データのバックアップなど、可変長レコードの記録に利用可能である。
【符号の説明】
【０１０４】
１，１′  システム制御部（記録装置）
１００    レコード構造（データセット、データ）
１０１    先頭フラグ（データセットの先頭を表わす情報）
１０３    前方データ長（前方データ長情報）
１０５    ローテーションフラグ（書き込みのローテーションを示す情報）
１０７    重複位置情報（ビット反転させた位置の情報）
１０９    データ部
１１      最古レコード特定部
１３      最新レコード特定部
１５      書き込み部
１１１    最後尾フラグ（データセットの最後尾を表わす情報）
１１３    後方データ長（後方データ長情報）
１１５    データ結合フラグ
１２３    第１ヘッダバイト
１２５    第２ヘッダバイト
１２７    フッタ部
３        可変長レコード記録部
５        ＣＰＵ（処理装置）
７        ＲＡＭ（別の記憶装置）
７１      次のレコードを書き込む位置
７５      データ長配置情報
９        不揮発メモリ（記憶装置）
９７      制御対象
【図１】
2013140516.tif 000003
【図２】
2013140516.tif 000004
【図３】
2013140516.tif 000005
【図４】
2013140516.tif 000006
【図５】
2013140516.tif 000007
【図６】
2013140516.tif 000008
【図７】
2013140516.tif 000009
【図８】
2013140516.tif 000010
【図９】
2013140516.tif 000011
【図１０】
2013140516.tif 000012
【図１１】
2013140516.tif 000013
【図１２】
2013140516.tif 000014
【国際調査報告】
2013140516.tif 000015
2013140516.tif 000016
2013140516.tif 000017
2013140516.tif 000018