- PR -

【C#】単一テキストファイルから重複行削除

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-13 16:21
引用:

夏椰さんの書き込み (2006-06-13 15:17) より:

こんな感じでOLEDBとしてファイルを読み取り
SELECT DISTINCT で重複を省くってだめなんでしょうか?

一度もそういう手法が出てこないので、
推奨されない手法なの否かが気になったので。


上に同じw

引用:

ちづるさんの書き込み (2006-06-13 15:19) より:

4万行(400KB)のデータを作成して実行してみたら、帰ってきませんでした…
というより、処理に時間がかかってるだけだと思いますが。

理想では10万行で5分〜6分くらいのレスポンスです。
(無理でしょうか?)


夏椰さんの方法が一番速くて安定しているように思います。
上の時間でいけそう・・・

#JETなのは何故?
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-06-13 16:27
引用:

一行が60文字程度の行なので、
最大でも1MBくらいあると思います。


私が提示したプログラムでは
ローカルで6.5Mのファイル(1〜65536の値が数回繰り返した状態・・・だったかな?)で
すぐに返ってきますね。<結果
#ちなみにWinXP Pentium4 3GHz メモリ1G・・・だったかな?


引用:

#JETなのは何故?


適当にコピってみたりしているから(w
_________________
夏椰 @ わんくま同盟
夏椰の庵
Microsoft MVP for Windows Server System - SQL Server ( Jul 2006 - Jun 2008 )
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2006-06-13 16:33
>夏椰様
そのような使い方を始めて見ました。目からウロコがボロボロ落ちましたw
奥が深いです・・・。
勉強になりますm(_ _)m

ぼのぼの様
>それはともかく、ReadToEnd+Splitで時間がかかってる気がします。
>ReadLineでループさせたらどうなりますか?
R・田中一郎様
>夏椰さんの方法が一番速くて安定しているように思います。

ReadToEnd+SplitだとReadLineで一行ずつ処理するよりも時間がかかってます。
夏椰様のレスを見るまでは一番早いのはhushtableなのかなぁ・・・と。
夏椰様の方法を試してみます。

R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-13 16:43
引用:

ちづるさんの書き込み (2006-06-13 16:33) より:

ReadToEnd+SplitだとReadLineで一行ずつ処理するよりも時間がかかってます。


それはそうでしょうね。
一度読み込んた大きなデータを配列に分解して再度格納するのですから。
hashtable を使う方法なら、1件読んでhashtableに聞けば教えてくれるので、配列を用いる必要は無いです。
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2006-06-13 17:37
夏椰様
引用:
私が提示したプログラムでは
ローカルで6.5Mのファイル(1〜65536の値が数回繰り返した状態・・・だったかな?)で
すぐに返ってきますね。<結果
#ちなみにWinXP Pentium4 3GHz メモリ1G・・・だったかな?


私の環境もWinXP Pentium4 3GHz メモリ1Gとほぼ同等のスペックで、
4万行(全行40文字)で実行してみたのですが、帰ってこなくなりましたorz
行の中身はランダム生成された文字列(例:4940ad9a59434782a9e402a294ebd3)30桁に
@ドメイン.co.jpなどのついたメールアドレスデータです。

>R・田中一郎様

引用:
それはそうでしょうね。
一度読み込んた大きなデータを配列に分解して再度格納するのですから。
hashtable を使う方法なら、1件読んでhashtableに聞けば教えてくれるので、配列を用いる必要は無いです。


配列を使用したほうが早くなりイメージでいましたが、分解作業などで
遅くなるのですね。勉強になりますm(_ _)m
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-13 17:48
引用:

ちづるさんの書き込み (2006-06-13 17:37) より:

私の環境もWinXP Pentium4 3GHz メモリ1Gとほぼ同等のスペックで、
4万行(全行40文字)で実行してみたのですが、帰ってこなくなりましたorz
行の中身はランダム生成された文字列(例:4940ad9a59434782a9e402a294ebd3)30桁に
@ドメイン.co.jpなどのついたメールアドレスデータです。


申し訳ないのですが、次の点を確認させて下さい。

・少ない件数で試してみる。
・どの部分で帰ってこないのか確認する。(DBエンジン側の処理で帰ってこない?)
・書き込み処理はどうしてます?
がうしぇ
大ベテラン
会議室デビュー日: 2002/02/26
投稿数: 110
お住まい・勤務地: 住:神社の裏山 勤:天神さんの裏手
投稿日時: 2006-06-13 18:04
Cygwinをインストールして、uniq コマンドとか、sedとか、せめて Perl を使う方が楽なのではないかと...

"鶏を割くに焉んぞ牛刀を用いん"というか、ザク一匹にソーラーシステムのような気が...
_________________
がうしぇ
人生のデザインパターン....
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-06-13 18:09
引用:

ちづるさんの書き込み (2006-06-13 17:37) より:

私の環境もWinXP Pentium4 3GHz メモリ1Gとほぼ同等のスペックで、
4万行(全行40文字)で実行してみたのですが、帰ってこなくなりましたorz
行の中身はランダム生成された文字列(例:4940ad9a59434782a9e402a294ebd3)30桁に
@ドメイン.co.jpなどのついたメールアドレスデータです。


通番+30文字@aaaa.co.jp
通番+30文字@bbbb.co.jp
(通版=1〜65536)
のデータが入ったトータル件数131,072件(ファイルサイズ:7,843,840 バイト)
でサンプルとして提示したプログラムを動かしたところ
30秒足らずで表示する処理は終わりましたね。
#ちなみにプログラムはVS2005 C# Expressで実行しています。

R・田中一郎さんもおっしゃっていますが、
データの取得で返ってこないのかなどを調べる必要があると思います。

現状のプログラムはデータを取得するのみの状態でしょうか?
問題切り分けのためにも、1つずつ処理を実装して、確認してみてください。

また処理内容に不安などがあれば、出来る範囲でソースを提示してみてください。


_________________
夏椰 @ わんくま同盟
夏椰の庵
Microsoft MVP for Windows Server System - SQL Server ( Jul 2006 - Jun 2008 )

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