ID非公開さん
2022/6/18 15:35
3回答
C言語で作ったプログラムの処理速度が遅いため、速くしたいです。
C言語で作ったプログラムの処理速度が遅いため、速くしたいです。 C言語でdatファイルの各データの添付の赤字部分(12バイト)を比較し、全く同じだったら別ファイル(.cfg)に3バイトTAB区切りでその12バイトを書き込みたいです。 比較する12バイトで同じものがどのくらいあるのか知りたいです。 処理を作ったのですが、1つのデータがファイルの最後まで比較し終えるのに約3秒かかります。データの最大個数が約500万を想定していて、3秒×500万=約4167時間かかる計算です。 最大個数で行った場合の処理速度が希望は数分なのですが、長いファイルなので最低でも24時間以内にはなんとか処理を終わらせられないかと考えております。 ご存じの方、ご教示ください。 〇ソース int readFile() { FILE* fp = NULL; size_t pos = 0; size_t standardPos = 0; size_t readRet = 0; char standardData[12+1]; char targetData[12+1]; memset(standardData, 0x00, sizeof(standardData)); memset(targetData, 0x00, sizeof(targetData)); fp = fopen("Data.dat", "r+b"); if (fp == NULL) { return -1; } pos = 2; standardPos = 2; fseek(fp, pos, SEEK_SET); readRet = fread(&standardData, 12, 1, fp); if (readRet <= 0) { return -1; } while (1) { while (1) { memset(targetData, 0x00, sizeof(targetData)); pos = 132; fseek(fp, pos, SEEK_CUR); readRet = fread(&targetData, 12, 1, fp); if (readRet <= 0) { break; } if (strcmp(standardData, targetData) != 0) { //比較して同じだったら別ファイル(.cfg)に書き込む } } memset(standardData, 0x00, sizeof(standardData)); pos = standardPos + 132 + 12; standardPos = pos; fseek(fp, pos, SEEK_SET); readRet = fread(&standardData, 12, 1, fp); if (readRet <= 0) { break; } } fclose(fp); return 0; } 〇データについて ・ファイル:dat ・ファイル数:1個 ・データ1つのバイト数:144バイト ・データ最大個数:500万 ・ファイルサイズ:686 MB (720,000,000 バイト) ・1つのデータは添付画像の黒い部分の0x20 0x20 ~ 0x20 0x20までの144バイトです。 ・比較したい場所:各データの赤字の部分の12バイトです。 ・やりたいこと:各データの添付画像赤字の12バイトと同じデータがファイル中に何個あるかが知りたいことです。 他に必要な情報があれば追記します。 よろしくお願いいたします。
ベストアンサー
もしかして、複数の重複するデータがそれぞれファイル内にいくつずつあるか調べる感じですか。 それならば、一度データを読み込み、ソートし、上から連続するデータを数え上げればいいです。 思い違いならすみません。
ID非公開さん
質問者2022/6/19 0:00
その通りです!参考にさせていただきます!
質問者からのお礼コメント
とても参考にも勉強にもなりました。 ありがとうございました。
お礼日時:6/20 12:28