• ベストアンサー

100万行のテキスト ファイル サクサク動く?

バックアップ、復元ソフトを作りながらC#を勉強してます。 復元するために、HDD内のファイルの情報(パス)を記録しておく必要があります。(あると思っている。違うのかもしれない。) そうするとHDD内の100万個のデータに対し、100万行のテキストファイルを作ることになります。 普段こんな膨大な行数のファイルを扱ったことはありませんが、オープンやクローズ、編集などサクサク動くものなのでしょうか?

  • gennya
  • お礼率90% (1051/1162)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

100万行(たぶん100Mバイトぐらい?)あっても、 シーケンシャルに読んだり書いたりするだけのことなら問題ないと思います。 ただ、バックアップしたファイルを 1ファイル1行で パス/サイズ/タイムスタンプ/オーナー/パーミッション を記録しておいて 次回のバックアップ時に実際に見つかったファイルが このリストファイル中にあるかを探して、それと比較することで 新規・削除・更新・変化なしを判断するという使い方になると思います。 ということは、バックアップ処理時にバックアップ元から見つかった1ファイルごとに  前回に記録しておいた100万行ものファイルを1行ずつ読み込みながら、 マッチするファイルを捜査していたのでは、非常に時間がかかってしまうことになるでしょう。 なので、テープメディアに増分や差分バックアップするのツールを作るのであれば SQLiteといったINDEXで検索できるDBを使うとか、 アプリに内蔵できるBerkeleyDBのライブラリを使うとか 自力で高速検索できるように二分木検索等の仕組みを作るとか そういうことが、最終的には必要になってくると思います。 しかし、テープメディアへの増分や差分バックアップという手法を使うのなら 上記のような工夫は必要でしょうけど HDDやUSBメモリーといったファイルシステムが使えるストレージへのへのバックアップであれば、 バックアップ先のディレクトリ構造そのものがDBとして使えるので リストファイル自体が不要になると思いますよ。 (バックアップ先のファイルシステム対してパス指定するだけで、  すぐにそのファイルのサイズやタイムスタンプ等の属性は取り出せるので)

gennya
質問者

お礼

回答ありがとうございます。

その他の回答 (5)

回答No.6

>>100万行のテキストファイル と言う考え方が、無意味です。 HDDへのアクセス(ディスクI/O)をいかに少なくするかが 重要です。 ディスクからメモリまたはメモリからディスクへのコピペ回数が 少なければ少ないほど、プログラムは早く動きます。 (潤沢なメモリがあることは前提ですが) 一行に何バイトあるのか知りませんが、 たったの100万行では現時点のPCでは 屁のようなものでしょう。 なので、バッファの大きさとかコピペの手法さえ 工夫すれば造作もないことです。 ※改行文字も文字なのでPCにとって行数は意味ないですが、  それを意味づけるコードなどは書かないことです。  一行一文字で10億行などを改行を意識して書くと遅くなると思います。

  • dell_OK
  • ベストアンサー率13% (740/5645)
回答No.4

バックアップと復元の部分はあとまわしにして、まずはそのテキストファイルを作るところまでをやってみることです。 それをどのように扱う予定かわかりませんが、もし画面に表示するのでしたらそうしてみてください。 気にされているタイミングもそうですが、他にもそれぞれの処理にどれくらい時間がかかるのかわかると思います。 サクサク動くかどうかよりも、そのようなソフトを作るのはとても勉強になると思います。 サクサク動かないなら作らない、と言うのであれば別ですが、そうでなければ、サクサク動くようにはどうしたらいいかを考えたりするのも勉強になると思います。

gennya
質問者

お礼

回答ありがとうございます。

  • sknbsknb2
  • ベストアンサー率38% (1127/2913)
回答No.3

直接の回答ではないですが、全ファイルの情報を1テキストファイルで管理する必要はないのでは。 1つのフォルダ内のフォルダ/ファイルの情報ということにすればずっと行数が少なくてすみますよ。

gennya
質問者

お礼

回答ありがとうございます。

回答No.2

>100万行のテキストファイル1個をプログラム上で扱うことは、大変なことではないうことですね。 ファイルポインタってのがあり、 今開いているファイル1つの、「どの位置」って情報があり、 その位置に「追加」するだけ!って感じで、 毎回、100万行の一番下はどこ~?とか探してるわけじゃないので。 それ自体は、体感では、わからないような速度ですよ。 (実際には、ある程度まとめてDISKに書き出されるので、書いた時点では、速度低下はほぼしません) 読み込みも同じように、 「行」=末尾に、\r\nまたは\nなどの「改行コード」を持った物を 1行として、取り込むのですが、これも、 今のファイルポインタからそれが来るまでのほんの少しだけを 読み込むので、これも、別に10万行だろうが100万行だろうが 速度は同じなんです。 上の理屈で、例えばファイルのパスを含め最大n文字としたら、 n文字+1文字(デメリタ=\0)で長さを決めてしまって、 それを、1つのデータとして扱う事で、 10個目のファイルは?(n文字+1文字)*10個目! と一瞬で行を特定することもできるようにもできます。 この場合、ファイルはバイナリーモードになりますが。 むしろ、その中からファイルを「探す!」ってのが 大変だとは思うので、そこは^^がんばです! ってことで、書かれてることだけを回答するなら、 一度に全部を見てるわけじゃないので、 遅くなるわけでもなく、普通に動きますよ! となりますね。

gennya
質問者

お礼

回答ありがとうございます。 とにかく普通に動くことが分かってよかったです。

回答No.1

>オープンやクローズ なぜ、オープン、クローズするかがわかりません。 「100万行のテキストファイル」が1個ですよね? でしたら、1個のファイルを開いたら開きっぱなしなので、 別に、100万行のファイルを開くわけじゃないと思いますが。 >編集など 別エディター等での編集は重いでしょうね。 ただプログラムで後方結合するのは別に早いですよ。 >サクサク動くものなのでしょうか? 一度に使うデータは「ある一行」でしかないと思うので、 それ自体は遅いと感じることはないと思います。 が、それを後から「検索して~」ってやりたいなら、 アルゴリズムは大変でしょうね。 ハッシュにするか、インデックスにするか。。 色々、遊べそうですね~

gennya
質問者

お礼

回答ありがとうございました。 >別に、100万行のファイルを開くわけじゃないと思いますが。 ⇒これは100万個の間違いでしょうか? 当方、この質問に関することは知識不足で分かりませんが、100万行のテキストファイル1個をプログラム上で扱うことは、大変なことではないうことですね。

関連するQ&A

  • テキストファイルの特定行の削除方法

    Accessからテキストファイルのオープンし、特定行を削除してクローズしたいです。どうすれば良いでしょうか。

  • テキストファイルの行を上下入れ替えるには?

    テキストファイルの行の上下を入れ替えたいです。 例えば4行あるとすると、最初の行を最終行、2行目を3行目、3行目を2行目、最終行を最初の行にしたいです。 かなりの行数があるのでコピペでは大変なので自動でできるようにしたいです。 どうすれば簡単にできるでしょうか?

  • ファイルの3行目までを出力したい

    Perl初心者です。 test.txtというファイルがあって、その中の1行目から3行目までを 出力したい場合はどうしたらいいでしょうか? open(FILE,"test.txt") || die "Open Error.\n"; @data = <FILE>; close(FILE); foreach (@data) { print $_; } これだと、ファイルの中身が全て出力されてしまいます。

    • ベストアンサー
    • Perl
  • バッチでテキストファイルから任意の行のみ取得したい

    batファイルを作成していて、 txtから特定の行のみをとりだし、変数に入れたいです。 どうもよくわからないので質問したいと思います。 まず以下の様なテキストファイルがあります。 ------------------- 111 222 333 ------------------- 実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。 行いたい動作は、 ----------------------------------------- 1.テキストファイルの1行目を変数Textに入れる(set Text=111) 2.変数Textを使用し色々処理をする 3.テキストファイルの2行目を変数Textに入れる(set Text=222) 4.変数Textを使用し色々処理をする ----------------------------------------- コレを繰り返します。 2と4は同じ動作ですので、行数のカウンタを設定しループさせる予定です。 n行目を全て取り出す方法がわかれば行けると思うのですが、 どうも見つかりません。ご存知の方がいればお教え願いたいと思います。

  • c# テキストファイル操作について

    C#でテキストファイルを読み込み、そのテキストファイルの行数を数えるようにしたいのですが・・・。 テキストファイルを読み込むことができたんですが、行を数えることができません。どなたか、教えていただけませんか?よろしくお願いします。

  • DBMとテキストファイルのどちらが良いと思われますか?

    こんにちは、 windows + ActivePerl の環境で、 簡単なデータを記録して後から検索、修正、削除したいのですが、 データを格納するのに、テキストファイルにするか、DBMを使用するか 悩んでいます。 テキストファイルに、(行番号,"*" x 100)のレコードを10万行出力したら、約10MBで、 DBMファイルに (行番号=>"*" x 100)のハッシュを出力したpagファイルは510MBでした。 その後、99999番目のレコードを以下のスクリプトで表示したところ、 体感的には違いがありませんでした。(どちらも一瞬で終了します) ******************************* #テキストファイル 検索 my $id = 99999; my $data; open(FILE,"<TEXTfile.txt") or die ; while(my $line = <FILE>){ if($line =~ /$id/){ $data = $line; last; } close FILE; print $data; ******************************* #DBMファイル 検索 my %DBM = (); my $id = 99999; my $data; dbmopen(%DBM,"DBMfile",0666) or die; if (defined $DBM{$id}){ $data = $DBM{$id}; } dbmclose %DBM; print $data; DBMを使用した場合、すべてのデータをメモリ上に展開するのでしょうか? もしそうなら、510MBも消費されてはたまりませんので、テキストファイルになりますが、 コーディング等はDBMの方が楽かな?と考えています。 データベースを利用できない環境の場合、どちらが良いのでしょうか? ご意見お願いします。

    • ベストアンサー
    • Perl
  • VB2005でテキストファイルの操作

    vb2005でテキストファイルを開き任意の行の編集を行いたい 最終行に追加する方法はわかったのですが 任意の行の編集方法がどのように実装してよいのかわかりません 編集したいテキストファイルは 各行の長さはまちまちです 普段は追記で文章が追加されますが 一定行になると再び最初の行(もしくは指定の行)から 上書きというのは可能なのでしょうか?

  • ExvelVBAでテキストボックスの2行目以降を記録するには。

    ExvelVBAでテキストボックスの2行目以降を記録するには。 ExcelVBA超初心者です。 以前に頂いた以下のコードなのですが、1行目の文字は記録されるのですが、2行目以降が記録 できません。2行目以降を記録するにはどうしたらよいのでしょうか。宜しくお願い致します。 テキストボックスのオブジェクト名 : txtMemo 1.×ボタンで閉じる時にテキストファイルへ保存 ユーザーフォームのTerminateイベントに下記処理記述 Private Sub UserForm_Terminate() Const TXT_FILE As String = "¥memo.txt" Open ThisWorkbook.Path & TXT_FILE For Output As #1 Print #1, txtMemo.Text Close #1 ' ファイルを閉じます。 End Sub 2.起動表示時に保存内容をテキストボックスに初期表示します。 ユーザーフォームのInitializeイベントに下記処理記述 Private Sub UserForm_Initialize() Const TXT_FILE As String = "¥memo.txt" Dim TextLine 'ファイルの存在チェック If Dir(ThisWorkbook.Path & TXT_FILE) = "" Then Exit Sub End If Open ThisWorkbook.Path & TXT_FILE For Input As #1 Do While Not EOF(1) Line Input #1, TextLine txtMemo.Text = TextLine Loop Close #1 ' ファイルを閉じます。 End Sub

  • 行に改行タグをつける

    テキストファイルで書いた文書の全ての行に、<br>タグをつけたいのですが 手動で行うと日が暮れるような膨大な行数があります。 フリーウェアか何かで何とかなるようなものをご存知の方おられましたらよろしくお願いいたします。

  • 【VBA】テキストファイルを指定行数からの読み込み

    こんばんは。 EXCEL VBAでテキストファイルを読み込む事について質問です。 VBAでテキストファイルをこちらから指定する行数(上から何番目という感じで)からデーターを読み込みたいのですが、どの関数をつかっていいかわからず困っています。 1行ずつ読みこむ「Input Line関数」では、無駄な行まで読み込むので動作が遅くなります。 読み込みたい行はすでにわかっているので、最初からその行に飛んでからデーター読み込みたいと思ってます。 ちなみに指定する行数は、ファイルによって違います。 あらかじめ「Input Line関数」で、ある文字が何行目にあるかを探す行為をあらかじめ行っています。 みなさまのアイデアを拝借したく、よろしくお願いします。

専門家に質問してみよう