• 締切済み

重複チェックプログラム

ご経験ある方いらっしゃいましたらアドバイスください。 環境:linux, gcc 64bitの整数データ(符号なし)を入力とし、64bitの整数データを出力する関数を作成中です。 入力データに対して、出力データは絶対に重複しないという条件で関数を作成したのですが、 (入力と出力は1対1になる) その条件のチェックができない状態で困っています。 試した方法は、以下のとおりです。 (1)すべての入力データに対する出力データをテキストファイルに書き出す。 (2)再びすべての入力データを計算するのだが、今度は出力データを(1)で作成したテキストファイルと比較していく。 そのときテキストファイル内に出力データと同じデータが2つ以上あれば重複が存在する。 しかし、(1)の時点でlinuxのファイル制限2.1GBに引っかかってしまい、 これ以上進めることができませんでした。 同じような大量のデータに対して重複確認することは不可能なのでしょうか? もし、linuxのファイル制限がなくてもHDDの容量制限に引っかかってしまいそうです。 このような制限に依存せず、重複確認できる方法がありましたら教えてください。 質問が不明、不足な点がある場合にもご指摘おねがいします。宜しくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.10

や, 「メモリ云々」はさておいて, 時間的に不可能でしょう>#8. 2^64通りを全部計算させようとすると, 1Tops (1秒間に 1兆通り計算する) でまわしても 1000万秒 (4ヶ月くらい) かかります. ということで, 「実際に全部出力して重複チェック」は事実上不可能です. その関数が完全に 1対1 の出力をすることを, 「アルゴリズム的に」証明するしかないと思います. ちなみに「PC」のメモリ容量は, 今だと 128GB くらいが限界じゃないでしょうか>#9. まあ, こんなに積もうとするといろいろ大変ですが.

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.9

#8です。補足 20bitという数には特に意味はありません。64bitOSにしてメモリを積めるだけ積めばもっと増やせますね。最近のPCって、いったい何GBくらい積めるんでしょうか。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.8

メモリが天文学的に必要となるか、時間が天文学的に必要となるかのどちらかですから事実上不可能でしょう。 あるいは、 http://www.kameson.com/climateprediction.htm こういったやつとか・・・。 時間で解決する方法としては、下位20bitのみを比較して、それを2^44回繰り返すとかでしょうか。 2^(64+44)の計算が必要となるので、いったいどれだけかかるのか見当もつきませんが。

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.7

2の45乗ですが・・・ ほぼ35テラバイトです。 それが、65,000個。 無理だと思いますが・・・

  • tig33
  • ベストアンサー率50% (6/12)
回答No.6

追加補足です。 2**61バイトのファイルができなくても、ファイル分割すれば、可能ですね。 2**16(=65536)個のファイルに分割すれば、一つのファイルは、2**45バイトのファイルになりますから、これで対応可能でしょう。 基本的に出現した数値のマップにすれば、たいした大きさにはならないと思いますけど・・・

  • tig33
  • ベストアンサー率50% (6/12)
回答No.5

2の64乗個のビット列をマップとして、出現したかどうかをビットフラグとしてチェックすればいかがですか? このマップをファイルにすれば、(2の64乗÷8)バイトのファイルで実現できますね。 ただ、2の61乗バイトのファイルってできましたっけ・・?

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.4

a,b,c が何を意味するのか、不明ですが・・・ y = f(x) 定義域(xの範囲) 64ビット整数 値域(yの範囲) 64ビット整数 xは、系統的に発生できる と考えていいのでしょうか? はっきり言って、無理だと思いますが・・・

  • splwtr
  • ベストアンサー率16% (75/461)
回答No.3

ファイル・サイズの制限が2.1GBとは、 NFSで1ファイルのサイズ制限でしょうか? 逆質問はおいといて、もしかして 出力ファイルが1ファイルが問題であって、出力ファイルを 検索しやすいように複数にしたら、今のままで十分な気がします。 時間はかかるでしょうけどね。 前準備に入力データをなんらかの規則でフィルタできたら、重複傾向も 見つけやすいような気もしますが、ここはわかりません。

  • POTATO_XP
  • ベストアンサー率10% (24/230)
回答No.2

テキストに書く目的・書かないといけない理由は何ですか?そもそも、何を調べる為のものなんでしょうか?では、初期のファイルはどうなっているんでしょう?本当に単純に書き出すファイルを分割するとかで対応できない理由って何なんでしょう?何がしたいかがイマイチ理解できません。更に補足ヨロシク!

  • POTATO_XP
  • ベストアンサー率10% (24/230)
回答No.1

入力データに対して、出力データが重複しない為の条件によりますが、単純にその関数を呼び出すスレッドを作成しその都度比較していけば良いのではないでしょうか?1回目と1回目は重複するとかなら、一回だけ空で回した後で比較するとか、スレッドの数に制限を設ける必要が無ければ、輪唱の様にスレッドを立てていきつつ、総当りで比較する様に作るなどイロイロやりようがあります。 的外れてたらすみません、条件をもう少し厳密に伝えて頂ければこちらとしても的確にアドバイスできるのですが・・・。Windowsでは専門知識多少アリ。

ring_rollo
質問者

補足

ご回答ありがとうございます。 もしかしたら説明不足かもしれませんでしたので補足させてください。 たとえば、 y = x というような関数が存在するとし、 このとき入力データが(a, b, c)の3つだけだとします。 この関数で入力に対する出力が重複しないことをチェックする方法として、 (1)まず(a, b, c)の3つのデータを関数で計算し、出力データをテキストファイルに書き出します。 ここでは、テキストファイルには(a, b, c)と書かれているはずです。 (2)再び(a, b, c)の3つのデータを関数で計算するのですが、計算するたびに出力データをテキストファイルに書かれているデータと比較します。 そのときテキストファイル内に出力データと同じデータが2つ以上あれば重複が存在することになります。 うえの例では入力データが(a, b, c)の3つという条件で問題ありませんでしたが、 入力データが64bitの整数データ(符号なし)すべてのように大量になった場合には、 (1)でテキストファイルに書かれるデータも大量になり、 実際にlinuxのファイル制限2.1GBに引っかかってしまいます。 これを回避する方法が教えていただきたいところです。 POTATO_XPさん >単純にその関数を呼び出すスレッドを作成しその都度比較していけば良いのではないでしょうか? テキストファイルにどうしてもデータを書き出す必要があり、こんな単純なことに気づきませんでした。ありがとうございます。 ファイルに書き出すのはどうがんばっても無理なんでしょうね。

関連するQ&A

  • 期間重複チェックがわかりません

    2年目の若手プログラマです 2年目にもなってこんなこともできないのかと 毎日のように怒られています VB2005+SQLServer2005で開発を行っています。 期間を3つ入力してデータを抽出する プログラムを作っているのですが 期間重複チェックがわかりません 期間(1)~期間(3)まであります(抽出条件) 1,2,3各期間重複する場合は再入力させるとしか 仕様書に書かれておらず プログラミングできず困っています。 期間(1) txtStartDate1.text txtEndDate1.text 期間(2) txtStartDate2.text txtEndDate2.text 期間(3) txtStartDate3.text txtEndDate3.text

  • 重複チェックである値はチェックしない方法

    エクセルの重複データを以下関数でチェックしています。 =IF(COUNTIF(A:A,A2)>1,”重複”,””) 例えばA列に○が複数入力されていた場合、○も重複としてみなされます。 これをカウントしないためには、どうすればいいかわかりますか? 複数条件で○を省くことができれば可能ですか?

  • プログラムについてです。

    main関数内でキーボードから入力された2つの整数について、その整数値の和差乗除をユーザ定義関数shisoku()内で計算し、main関数内で結果を出力するプログラムを作成せよ。 ただし、すべて局所変数で構成し、大域変数を使ってはならない。 僕は和差、乗除はできるんですが和差乗除ができません。

  • エクセルで重複チェック

    始めまして。エクセルでデータの重複を確認するのにはどんな手法があるかを考えています。アクセスとかだとできそうですが、エクセルでも何か関数を組み合わせてできるものなのでしょうか?データ件数は1500~2000件くらいで、1データはカタカナ、1列なんですけど・・。宜しくお願いします。

  • 一般的なプログラムの作り方

    こんにちは。 あるプログラムをVC++にて作成しようとしています。 このプログラムは、入力ファイルからテキストを読み込み、編集してから、出力ファイルを生成するというものです。出力ファイルは新規の場合と、上書きの場合があります。 そこで質問なのですが、プログラムの作り方として、以下のパターンが考えられるのですが、どちらが一般的なのでしょうか。 【パターン1】 入力ファイルからのテキスト読み込み、編集及び出力ファイルの生成を同時に行う。 ・長所として考えられる点 メモリ内で持つデータが一時的な領域なため、構造がシンプルでメモリ使用量も少ない。 ・短所として考えられる点 処理の開始から終了まで、出力ファイルを開いたままにするため、他から出力ファイルを編集できない時間が長くなる。 【パターン2】 入力ファイルからのテキスト読み込み、編集が全て完了してから、一括で出力ファイルへ書込む。 ・長所として考えられる点 出力ファイルへアクセスする時間が短くてすむ。 ・短所として考えられる点 メモリ内で全て編集するため、メモリ使用量が増大かつ構造が複雑になる。 以上です。アドバイスなどありましたら、よろしくお願いいたします。 【環境】 Windows XP Professional 入力ファイルのデータ量:10MB程度 出力ファイルのデータ量:1MB程度

  • VB6 重複チェックについて

    お世話になります。 次の処理をVisual Basic6.0で教えてください。 1.Text1にキー入力した値をコマンドボタンクリックすると、Text1の値を保存します。 2.次にText1に新たに入力してコマンドボタンクリックで前項で保存した値と重複して   いないかチェックして重複無しならText1の値を保存します。 3.Text1に新たに入力して・・・・重複チェックして・・・・ といった具合に保存する値と重複チェックする対象の値がどんどん増えていきます。 さすがに10,000件はいかないですが。 保存先は読み書き込みの時間も考慮してVB内のTextBOXが第1希望、外部のtxtファイルやcsvファイルは第2希望としたいです。 If Text1=保存値 Then  処理 else  処理 End If 保存値をText2として行いましたが、完全一致でないとダメでした。 入力値:保存値=1:n(入力値が複数の保存値と重複したかどうか)が知りたいです! お手数おかけしますが、何卒よろしくお願いします。

  • エクセルの「入力規則」を用いての重複チェックについて

    エクセルの「入力規則」を用いての重複チェックについて エクセルの「入力規則」でcountif関数を使い、重複チェックをしながら 入力をおこなっております。 重複の時メッセージがでるのですが、これに加えてどこと同じなのか その行をセレクトした状態など、該当するデータが分かるようにすることは 可能でしょうか? 何か方法がございましたら、ご助力をお願いいたします。

  • c言語でのヒストグラム作成用のプログラム

    -50から500までの整数が一列に乱数で入力されたテキストファイルを読み込んで-50が何個、-49が何個、・・・、499が何個、500が何個といった感じにに出力するCプログラムが分かりません。 テキストファイルの中身は-50から500までの整数が一列に書いてあります。説明不足かも知れませんがわかる方よろしくお願いします。

  • perlでファイルを読み込んだ順で重複行チェック

    perl初心者です。 ファイルを読み込んで重複行について以下の処理をおこないたいです。 ハッシュを使えば比較的苦労しないでできそうなのですが、 ファイルを読み込んだ順に出力をしたいので悩んでいます。 アドバイスをお願いします。 やりたいこと。 ・タブ区切りのファイルを読み込む ・ファイルの出力順は入力ファイルの上から順とし、並び替えを変えたくない。 ・重複行だけのファイルと重複していないファイルを作りたい。←パターン1,パターン2 例) 以下の入力ファイル(タブ区切り)についてidをキーに重複行チェック 入力ファイル id name age 1 質問一郎 20 2 質問和美 30 3 質問次郎 40 1 回答花子 50 3 回答太郎 22 ・パタン1の出力 重複ファイル 1 質問一郎 20 1 回答花子 50 3 質問次郎 40 3 回答太郎 22 ユニークファイル 2 質問和美 30 --------------------- ・パタン2の出力 ※ 重複ファイル 1 質問一郎 20 1 回答花子 50 3 質問次郎 40 3 回答太郎 22 ユニークファイル 1 質問一郎 20 2 質問和美 30 3 質問次郎 40 パターン2の場合、ユニークファイルには最初に読み込んだ重複ファイル1行分も出力させる。

  • 【エクセル】データの重複チェック

    次のようなデータが入力されているとします。 A列/B列/C列/D列/E列/F列 1行:都道府県/市区町村/data1/check1/data2/check2 2行:東京/新宿/1/""/1/"" 3行:東京/新宿/2/""/2/"重複" 4行:東京/新宿/3/""/3/"" 5行:東京/渋谷/1/重複/4/"" 6行:東京/渋谷/2/""/5/"" 7行:東京/渋谷/3/""/6/"" 8行:東京/渋谷/4/""/2/"重複" 9行:東京/渋谷/1/重複/7/"" ここで、check1は、 「都道府県」のグループでdata1に重複があれば、「重複」表示をさせます。 また、check2は、 「市区町村」のグループでdata2に重複があれば、「重複」表示をさせます。 例えば、 セルD2=IF(COUNTIF($C$2:$C$4,$C$2:$C$4)>1,"重複","") セルF2=IF(COUNTIF($E$2:$E$9,$E$2:$E$9)>1,"重複","") というように関数を入力して、2行目以下にコピペすればいいのですが、 実際は1万行以上のデータがあり、「都道府県」「市区町村」も多くのグループがあるため いちいち範囲を指定するのも大変です。 そこで、上記関数のように手動で範囲を指定しなくても、 自動で範囲指定をして重複チェックができる良い方法があれば教えてください。 できれば関数がいいのですが、VBAでも構いません。 ご教授のほど、よろしくお願いします。