- PR -

非常に大きなテキストファイルの編集

投稿者投稿内容
m.ku
大ベテラン
会議室デビュー日: 2002/09/15
投稿数: 184
投稿日時: 2004-08-28 14:26
内容的には基本ラインはSEDってとこかな?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-28 18:59
引用:

ForgetMeさんの書き込み (2004-08-28 13:49) より:

やはり、メモリ上に格納してからという結論ですね。大変参考になりました。


 結論が先にあったのでしょうか?(やはり、という言葉)

 たとえば、えムナウさんの2,3ということなら、読み込み用のディスクリプタと書き込みようのディスクリプタを用意し、読み込んで、比較して、該当するなら書き換え、該当しないならそのまま書き出す。書き出し後にリネームする、という方法もあります。これなら、使用するメモリは少なくてすみます。
ForgetMe
会議室デビュー日: 2004/03/25
投稿数: 7
投稿日時: 2004-08-28 20:14
m.kuさん返信ありがとうございます
>内容的には基本ラインはSEDってとこかな?
すいません、私にはすこしわからない内容です。

Jittaさん どうも返信ありがとうございます。
メモリ上に格納して、そこから書き出す方法はこのスレッドを立てる前に
一応案としてありました。しかし、それでは、ファイルを新しくもう一度全部
複写することになり、非効率ではないかと考えたわけです。もし、もっと効率的な
ファイルの書き直す方法があればと、スレッドを立てた次第です。
しかし、Unibonさんに指摘いただいた、システムダウン等のことを考慮すると、
メモリ上格納→書き出す→リネームの手順の方が確実のようですので、そちらを採用しようかと考えてます。

また、使用するメモリを少なくてすむ方法を紹介していただきありがとうございます。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2004-08-28 23:54
一般的な方策としては、

(1) ファイルの内容をすべてメモリー上に読み込んでから編集して、書き戻す。
(2) ファイルの内容をすべてメモリー上に読み込んでから編集して、テンポラリファイルに書き出す。
その後、対象ファイルをバックアップファイルにリネーム、
テンポラリファイルを対象ファイルにリネーム。
(3) ファイルの内容を一行ずつ読みながら処理して、結果は逐次テンポラリファイルに書き出す。
その後は、(2)と同じ手順。
(4) 対象ファイルをメモリーにマップし、それを編集して、flushする。

対象データの性質と要求される特性に合わせて選ぶことになります。

(1)は実装が一番簡単ですが、書き戻しの途中でエラーになると元ファイルと処理結果の双方が失われる危険がある。
(2) は、元ファイルがハードリンクされていた場合にやや困ったことになる。
(3) は処理効率が悪くなりがちだが、必要とするメモリーが少なくてすむ。
(4) は、処理効率は一番高そうだが、(1)と同じ欠点がある上に、実行環境(OS)に激しく依存した実装になる。(例えば、linuxとWindowsで全く違うAPIを使用する)

ほとんどのテキストエディタは(2)の方式、sedは(3)の方式になります。

追記:
編集の頻度が高い場合は、テキストファイルで持つのを諦めてデータベースを使うのが正解かと思います。
RDBを使うのは大げさだと言う場合、BerkeleyDB とか MDAC という選択もあるし。

[ メッセージ編集済み 編集者: coasm 編集日時 2004-08-29 00:00 ]
ForgetMe
会議室デビュー日: 2004/03/25
投稿数: 7
投稿日時: 2004-08-29 11:19
coasmさん いろいろな方法とそれに付随する欠点等の返信をいただきありがとうございます。大変参考になりました。
また、SEDとは:ファイルの内容を一行ずつ読みながら処理して、結果は逐次テンポラリファイルに書き出す。ということだったのですね
さらに、データベースという方法を指摘していただきありがとうございます。
いま現時点で、編集するファイル等はテキストファイルとしてあるため、まずはテキストファイルとして、プログラムを完成させようと思ってます。それが一段落したら、データをテキストファイルからデータベースへの移行検討したいと思ってます。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-29 12:48
誤解されているようなので。
sed は、UNIXやLinuxのストリームエディタのひとつです。
UNIXやLinuxのストリームエディタでは最も有名です。
http://www.linux.or.jp/JM/html/GNU_sed/man1/sed.1.html

_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2

スキルアップ/キャリアアップ(JOB@IT)