C++相談室 part136

■ このスレッドは過去ログ倉庫に格納されています
2018/06/07(木) 23:40:12.36ID:GNQuDMaA0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part135
https://mevius.5ch.net/test/read.cgi/tech/1522495206/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/07/08(日) 23:16:50.92ID:w/p0hjmq0
テキストのパースなんてそれこそperlやpythonにやらせろよ
そんなところが速度にクリティカルに効いててゴリゴリ高速化しなきゃいけないのは作りがおかしい
2018/07/08(日) 23:30:01.88ID:yMyBSsTod
>>768
質問者が固定長なんて書いてた?
固定長と言い出したのはあなたでしょ?
2018/07/08(日) 23:41:27.36ID:yMyBSsTod
>>767
読み込み以外、ライブラリなんか使わずに全て自分のコードにしてみようか
そうすれば色々とわかるはず
読み込みは16MBずつとかにすれば速い

出力先はファイル?メモリ上?
数値は32bit floatで保存するとして
文字列は?
そのままの形で使う?
読み飛ばす?
2018/07/08(日) 23:43:29.21ID:q7fGM+tb0
>>772
お前何年前のゴミSEだよ
古代文字解析みたいな手法揚げやがって
lexical analyzer 系統使うだろ
2018/07/08(日) 23:47:06.61ID:ib3y3idC0
SQLite はメモリ上にDBを構築できるので試してみるのもいいでしょう。
起動時のテーブルの初期化が大変だけど、あとはサクサク。
778デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/08(日) 23:54:44.54ID:IBdHDRbb0
な、知恵遅れたちはテキトーなことばっかりいってる
こんなゴミみたいなコードで速攻でかけるのに
779デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/08(日) 23:55:41.66ID:IBdHDRbb0
ゴミはめちゃくちゃしょうもない簡単なコードを
いちいち複雑にする

そしてもだれもメンテナンスできなくなる
2018/07/08(日) 23:56:30.09ID:Jzinsuog0
自分への間違い指摘は全部無視するのが半角スタイル
781デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/08(日) 23:57:09.03ID:IBdHDRbb0
オレはなにも間違ったこと書いてない
2018/07/08(日) 23:57:21.06ID:yMyBSsTod
数値の行は以下みたいなドロくさい処理を4回繰り返せば良い

unsigned int n = 0;
do {
unsigned char ch = (unsigned char)(*data++ - '0');
if (ch <= 9)
{
n = n * 10 + ch;
}
else {
break;
}
} while (true);
2018/07/08(日) 23:57:59.70ID:fRwyFHTq0
サーバーなんだから、普通にDB使えるだろう
784デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/08(日) 23:59:14.83ID:IBdHDRbb0
だいたい分かるわ
やっぱりなPGなんか低学歴しかやらない
2018/07/09(月) 00:00:03.01ID:EkQ+mvr8d
単に統計情報が知りたいだけならわざわざ重くしてから処理をする必要もないし
DBに入れるにしても解析しないとダメだろ
786デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:03:17.82ID:c1VUAguL0
たとえば1行目なんかこんなしょうもないのでとれる

int get_type(unsigned char const* buf, t_baka_type_t* pt_baka_type_t, unsigned char const** pct_next) {
unsigned char const* c_buf = buf;
for (; !isspace(*c_buf); ++c_buf) ;
if (!::strncmp((char const*)buf, TYPE_STRING, c_buf - buf)) {
pt_baka_type_t->baka_type = BAKA_TYPE_STRING;
} else if (!::strncmp((char const*)buf, TYPE_INT_TO_FLOAT, c_buf - buf)) {
pt_baka_type_t->baka_type = BAKA_TYPE_INT_TO_FLOAT;
} else {
fprintf(stderr, "氏ねヴォケ\n");
return -1;
}

pt_baka_type_t->u_records = strtoul((char const*)c_buf, (char**)&c_buf, 10);
++c_buf;

*pct_next = c_buf;
return 0;
}

はっきりいってな、2行目以降の数値も文字列もやりかたなんか同じだからな
ドカタ作業
787デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:08:20.49ID:c1VUAguL0
ゴミは口だけは達者
しかもアリエナイ頭ワルイことばっかりいうからな
2018/07/09(月) 00:08:49.29ID:EkQ+mvr8d
わざわざ標準ライブラリを使うために小細工しなくても良いんじゃないの?
何がどういう順番で書いてあるかはわかってるようだし無駄に重くしなくても
789デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:10:37.45ID:c1VUAguL0
きっとなオマエが書いたゴミコードより標準ライブラリのほうが
バグもないし早いと思うわ
2018/07/09(月) 00:11:39.32ID:UZv1uWMQ0
いかにもバッファはみ出してそうなきったねえコードですね
いまどきポインタで文字列処理すんじゃねえよ老害
791デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:12:54.25ID:c1VUAguL0
な、知恵遅れはこんなとこで書いたサンプルに
エラー処理が入ってると思ってる

もうねコレだから低学歴は困るわけ
792デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:13:53.01ID:c1VUAguL0
日本のPGは低学歴しかいないのが
このスレで何度も証明されてる
2018/07/09(月) 00:17:45.37ID:EkQ+mvr8d
学歴コンプか?
794デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:19:33.01ID:c1VUAguL0
低学歴に反応してるということは
図星なんだろ

もう分かってるからな

悪いけどなレスみれば低学歴なのは
残念ながらすぐに分かってしまう
低学歴特有のレスというのがある

隠そうとしてもムダ
2018/07/09(月) 00:21:50.74ID:UZv1uWMQ0
ポインタいじくり回してメモリ境界踏み壊すコードを書くのが大好きなすうぱあぷろぐらまあ様は
無駄な高学歴の方が多いという個人的な印象
796デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:23:07.75ID:c1VUAguL0
あのレベルでポインタいじくりまわしてる?
どんだけオツムが弱いねん・・・
797デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:26:52.35ID:c1VUAguL0
ようするにポインタが理解できてない
こんなのがプログラマさまきどってるのが日本だからな

そらなこんなのがコードいじくってたら
障害ばっかりおきるハズだわ
2018/07/09(月) 00:28:24.71ID:Z1S7bos70
未だにこんな化石みたいなヤツが居たことに驚きなんだが
2018/07/09(月) 00:29:58.95ID:1qBtnID4d
>>786みたいに、何度も何度もスキャンするような無駄の多いコードが速いわけないだろ
800デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:30:58.58ID:c1VUAguL0
低学歴は自分を大きく見せようとするからな
5f34-M0Jq ← コイツなんか典型的といっていい

わかってしまう
きっとコイツは専門卒
残念なことにレスみればすぐに分かる

だてにいままでいろんなゴミを相手にしてきたワケではない
801デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:32:10.58ID:c1VUAguL0
何度もスキャン?
一回しかスキャンしてないぞ

まずコードがよめてない
ポインタは後ろにしか進んでないのに
2018/07/09(月) 00:34:20.75ID:UZv1uWMQ0
strncmpが中で何やってるか知らないんだねかわいそうに
803デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:34:44.55ID:c1VUAguL0

もしかして
必要な1回の文字列判定を何度もスキャンとかいってるの?
804デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:36:07.46ID:c1VUAguL0
低学歴によると
通常の字句解析と構文解析を一緒にするのか
なるほどな
2018/07/09(月) 00:37:52.14ID:oMFJCZ8na
たくさんの情報大変参考になります。
サンプルコードもありがたいです。
実際に動かしながらどう動いているのか調べてみます。

>>775
読み込みを16MB単位でやってみます。
ファイルに出力することはなくて、読み込んだ情報をGUIでクリックして、
こっちをクリックするとこんな結果になっている、こっちだとこの結果、
というようなビューアを作ろうとしています。
文字列も重要な情報なので、
struct info{
2018/07/09(月) 00:41:56.28ID:AazuLIX60
それならそもそもファイル全体を解析しておく必要もないのでは?
807デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:43:27.81ID:c1VUAguL0
よしオマエはいい子のようだから
STRINGの部分をとるコードもあげよう

int get_data_string(unsigned char const* buf, t_baka_type_t const* ct_baka_type, unsigned char const** pct_next) {
  unsigned char const* c_buf_b;
  unsigned char const* c_buf_e = buf;
  for (uint32_t i = 0; i < ct_baka_type->u_records; ++i) {
    c_buf_b = c_buf_e;
    for (; *c_buf_e != '\x0a'; ++c_buf_e) ;
    // c_buf_b から始まる c_buf_e - c_buf_b の長さが取得する文字列
    fprintf(stdout, TYPE_STRING":%.*s\n", c_buf_e - c_buf_b, c_buf_b); // ← ココでとれる
    ++c_buf_e;
  }

  return 0;
}
2018/07/09(月) 00:49:09.36ID:4jZgSN4s0
>>786
入力が不正の場合にメモリフォルト起こすコードは絶対受け付けられない
2018/07/09(月) 00:49:43.29ID:AazuLIX60
だね
810デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:50:43.58ID:c1VUAguL0
バリデーションチェックは自分で入れるにきまってるだろ
アホちゃうかコイツラ
811デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:51:20.09ID:c1VUAguL0
そういうレスしかできないからな
程度が知れるわけ

低学歴らしい
2018/07/09(月) 00:51:52.89ID:AazuLIX60
言い訳が見苦しい
813デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:53:03.02ID:c1VUAguL0
いいわけ?
マジでいってるわけ?

ホントな頭悪い
814デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:53:36.22ID:c1VUAguL0
典型的な低学歴のレスといっていい
2018/07/09(月) 00:55:36.81ID:AazuLIX60
コードでも学歴でも何でも良いけど
勝負するなら受けるよ
816デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:56:18.28ID:c1VUAguL0
ハナクソがオレとなんの勝負すんの
2018/07/09(月) 00:58:04.11ID:AazuLIX60
日本語も読めないのか
2018/07/09(月) 00:58:34.17ID:VjVxTpnI0
職場もこんな雰囲気?
819デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 00:59:12.63ID:c1VUAguL0
ハナクソは
学歴も書いてないし
コードも書いてない

で?
820デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 01:01:13.46ID:c1VUAguL0
低学歴知恵遅れは
コミュニケーション能力もゼロに近い

そもそも唐突に
なにがしたいのか
なにがいいたいのか
意味が分からないワケ
821デフォルトの名無しさん (ワッチョイ 5f2b-ExT7)
垢版 |
2018/07/09(月) 01:02:30.85ID:4jZgSN4s0
いまどき自前の字句解析処理をCでポインタ使って書くなんて
バッファ境界のチェックとか面倒だし絶対ミスるからやめた方が良いって話なのに
いきなりエラー処理完全無視したコード出されてドン引きです
822デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 01:03:34.22ID:c1VUAguL0
どんびきするとかしないとかは
オマエの勝手だからな
2018/07/09(月) 01:04:20.90ID:AazuLIX60
>>821
ポインタも扱えないようなレベルならC++は使わない方が良い
2018/07/09(月) 01:04:49.68ID:ZGamhF5dM
あんまりゴミだから自信満々なc1VUAguL0がコード貼ってるのに気が付かなかったな、ログ読み直しちゃったよ
学歴は書いてないみたいだけど
2018/07/09(月) 01:05:34.06ID:AazuLIX60
>>820
勝負する気があるの?
ないの?
あるなら方法を決めるけど
826デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 01:05:40.33ID:c1VUAguL0
scanと解析に時間がかかるとかいってるから
オレはベストプラクティスをだしてる
827デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 01:07:55.27ID:c1VUAguL0
まず目的が理解できてないからな
2018/07/09(月) 01:08:10.00ID:AazuLIX60
あれでベストか
829デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 01:10:13.35ID:c1VUAguL0
ベストじゃないと思うなら
ベストな方法はれよ

臆病者なんか
2018/07/09(月) 01:10:21.54ID:AazuLIX60
勝負に目的ねえ
まあ別にやらなくても結果はわかるけど
831デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 01:10:46.49ID:c1VUAguL0
はよベストなもんはれよ
2018/07/09(月) 01:19:02.82ID:AazuLIX60
>>767を読めば>>786が糞なのがわかる
833デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 01:54:56.54ID:c1VUAguL0
やっぱりバカの限界というやつだな
オミヤゲだけはって寝よ

1行目とるヤツ
さっきとかわらず

int get_type(unsigned char const* buf, t_baka_type_t* pt_baka_type_t, unsigned char const** pct_next) {
  unsigned char const* c_buf = buf;
  for (; !isspace(*c_buf); ++c_buf) ;
  if (!::strncmp((char const*)buf, TYPE_STRING, c_buf - buf)) {
    pt_baka_type_t->baka_type = BAKA_TYPE_STRING;
  } else if (!::strncmp((char const*)buf, TYPE_INT_TO_FLOAT, c_buf - buf)) {
    pt_baka_type_t->baka_type = BAKA_TYPE_INT_TO_FLOAT;
  } else {
    fprintf(stderr, "氏ねヴォケ\n");
    return -1;
  }

  pt_baka_type_t->u_records = strtoul((char const*)c_buf, (char**)&c_buf, 10);
  ++c_buf;

  *pct_next = c_buf;
  return 0;
}
834デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 01:56:57.90ID:c1VUAguL0
2行目以降のSTRINGとれるヤツ
※ 次のバッファの継続ポインタの格納をしてなかったので追加

int get_data_string(unsigned char const* buf, t_baka_type_t const* ct_baka_type, unsigned char const** pct_next) {
  unsigned char const* c_buf_b;
  unsigned char const* c_buf_e = buf;
  for (uint32_t i = 0; i < ct_baka_type->u_records; ++i) {
    c_buf_b = c_buf_e;
    for (; *c_buf_e != '\x0a'; ++c_buf_e) ;
    // c_buf_b から始まる c_buf_e - c_buf_b の長さが取得する文字列
    fprintf(stdout, TYPE_STRING":%.*s\n", c_buf_e - c_buf_b, c_buf_b); // ← ココでとれる
    ++c_buf_e;
  }

  *pct_next = c_buf_e; // ← たりなかったので追加
  return 0;
}
835デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 01:59:16.59ID:c1VUAguL0
2行目以降のTYPE_INT_TO_FLOATとれるヤツ

int get_data_int_to_float(unsigned char const* buf, t_baka_type_t const* ct_baka_type, unsigned char const** pct_next) {
  unsigned char const* c_buf_e = buf;
  int32_t i_val[4]; // とりあえずのテキトーにいれた一時バッファ

  for (uint32_t i = 0; i < ct_baka_type->u_records; ++i) {
    for (uint32_t j = 0; j < 4; ++j) {
      i_val[j] = strtoul((char const*)c_buf_e, (char**)&c_buf_e, 10);
    }
    ++c_buf_e;

    fprintf(stdout, TYPE_INT_TO_FLOAT":%d,%d,%d,%d\n", i_val[0], i_val[1], i_val[2], i_val[3]); // ← ココでとれる
  }

  *pct_next = c_buf_e;
  return 0;
}
836デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 02:01:59.87ID:c1VUAguL0
とりあえずのテキトーな宣言

#define TYPE_STRING "STRING"
#define TYPE_INT_TO_FLOAT "INT_TO_FLOAT"

typedef enum __ENUM_BAKA_TYPE {
  BAKA_TYPE_STRING,
  BAKA_TYPE_INT_TO_FLOAT,
  BAKA_TYPE_UNKNOWN
} BAKA_TYPE;

typedef struct __tag_baka_type_t {
  BAKA_TYPE baka_type;
  uint32_t u_records;
} t_baka_type_t;

int get_type(unsigned char const* buf, t_baka_type_t* pt_baka_type, unsigned char const** pct_next);
int get_data_string(unsigned char const* buf, t_baka_type_t const* ct_baka_type, unsigned char const** pct_next);
int get_data_int_to_float(unsigned char const* buf, t_baka_type_t const* ct_baka_type, unsigned char const** pct_next);
837デフォルトの名無しさん (ワッチョイ 0780-Rmg1)
垢版 |
2018/07/09(月) 02:03:33.03ID:c1VUAguL0
コレでとりあえず動かせる

int main(int argc, char** argv) {
  unsigned char const* buf = (unsigned char const*)
    "STRING 3\x0a"
    "This is pen.\x0a"
    "hoge piyo\x0a"
    "hello world.\x0a"
    "INT_TO_FLOAT 9\x0a"
    "12345 1000 10 12\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a";
  unsigned char const* c_buf = buf;
  t_baka_type_t t_baka_type;

  // 実際の処理ではt_baka_type.baka_typeをswitchで分岐しながら処理することになる
  get_type(c_buf, &t_baka_type, &c_buf);
  get_data_string(c_buf, &t_baka_type, &c_buf);
  get_type(c_buf, &t_baka_type, &c_buf);
  get_data_int_to_float(c_buf, &t_baka_type, &c_buf);
}
2018/07/09(月) 09:54:17.47ID:UZv1uWMQ0
ろくなエラーチェックもしてないと自分で白状してるゴミコードを誰が動かすと思うのか
2018/07/09(月) 10:25:08.16ID:iaaXEW9a0
5chに貼ってしまった以上、権利的にジムしか動かせないなーw
2018/07/09(月) 11:04:11.17ID:K7fYzOo4a
__の後に大文字は予約されてるはずでは?
2018/07/09(月) 11:49:18.73ID:gGpmJBA50
そこ突っ込むなら他にも色々あると思うが
なんでC++でtypedef struct/enumなの、とかなんで文字列がunsigned charなの、とか
メタプログラミングじゃない構造体の型名に_tとか付けるな、とか
2018/07/09(月) 13:05:01.50ID:igQMhEfYa
ざっと見たけどすごいスレだな

10年ぐらい前だったらこういうこともありかなって思った時期があるけど今はもうそんな時代じゃない
で大部分レスができてしまう
2018/07/09(月) 13:18:07.24ID:4W5c2ICHd
名前の付け方はどうせそれぞれの環境に合わせるだろうからどうでもいいけど
中途半端な最適化が良くないな

今回は用途もデータ構造もわかっているし
目的が高速化なわけだから
2018/07/09(月) 15:16:51.81ID:jLUHXtTZ0
>>842
多次元配列 (boostを使わない場合) は?
845デフォルトの名無しさん (ワッチョイ 87b3-q+oR)
垢版 |
2018/07/09(月) 15:23:55.96ID:tG10WBhN0
boostを積極的に使っていこう。
846デフォルトの名無しさん (ワッチョイ 5f7f-KMj/)
垢版 |
2018/07/09(月) 16:10:51.38ID:OMEWQnbN0
ほらよ
https://goo.gl/uAcy7u
847デフォルトの名無しさん (ワッチョイ 87b3-q+oR)
垢版 |
2018/07/09(月) 17:19:12.55ID:tG10WBhN0
壮絶ゲームズ株式会社。
848デフォルトの名無しさん (ワッチョイ 87b3-q+oR)
垢版 |
2018/07/09(月) 17:19:46.15ID:tG10WBhN0
http://sozetsugames.jp/about.html
2018/07/09(月) 20:38:18.02ID:FCmEWxOPa
ご連絡おそくなりすみません。
たくさんのサンプルありがとうございます。
今日はファイル読み込みの対応ができなかったので明日このスレを見ながら試してみようと思います。

ちなみにフォーマットはSTRING行が先にきて、次にINT_TO_FLOAT行がきます。
STRINGで始まり、INT_TO_FLOATで最後は終わります。
後出しの情報になり申し訳ありません。
>>786 でどっちが来るかの判定までしていただいていたので一応ご連絡しておきます。

STRING 2
This is pen.
hello world.
INT_TO_FLOAT 1230
100 100 110 110
101 101 200 200
〜あと1228行
STRING 5
hoge piyo
foobarbaz
It is a July 9 today
It rained all day today
INT_TO_FLOAT 830
100 100 110 110
101 101 200 200
〜あと828行
2018/07/09(月) 20:49:04.01ID:FCmEWxOPa
すみません、 >>849 のSTRING 5の部分は4行になってますね。
この場合 STRING 4 になります。。
2018/07/09(月) 20:58:02.33ID:AazuLIX60
作って実験してみたよ
一行に4個の数字がある行を
適当な数値を乗算して構造体のvectorに入れていく
ファイル上の位置も格納するので
間の文字列も必要な時に表示出来る

うちの環境だと
読み込みだけで77.9秒
解析だけで24.3秒
読み込みと解析合わせて78.1秒
アプリはシングルスレッドだけど
勝手にOSが先読みしてくれてるのかな?

読み込み単位は2次キャッシュに確実に収まる1MBくらいが良さそう
2018/07/09(月) 21:10:32.06ID:jdPfoelBa
STRINGとINT_TO_FLOATは何か関連性はあるの?
2018/07/09(月) 21:10:56.23ID:AazuLIX60
2次じゃなくて3次

struct LOG {
float num[4];
uint64_t line_start;
uint64_t line_end;
};

こんな構造体に入れていくようにしてみた
文字列はクリックした時にファイルを読みに行けば良いよね
2018/07/09(月) 21:12:07.34ID:AazuLIX60
STRING n の後にn行文字列
INT_TO_FLOAT n の後にn行数値
これが交互にくる
ってことでしょ
2018/07/09(月) 21:13:59.28ID:AazuLIX60
数値に対応する何か(グラフ?)をクリックすると
その周囲の文字列と数値が表示出来れば良いのかな?
と思った
2018/07/09(月) 21:15:34.95ID:AazuLIX60
文字列の解析は速く出来そうだから
あとはUIに凝ってくださいな
2018/07/09(月) 21:21:01.41ID:AazuLIX60
数値も文字列も数行ずつかと思ったけど
1000行とかになるのか

数値ブロック、文字列ブロックは
それぞれ平均何行くらい?
2018/07/09(月) 21:22:46.55ID:jdPfoelBa
メモリが大変な事になりそうなのでstringとint_to_floatの行のアドレスだけ取得して、
必要になった時に読みに行ってintからfloatに変換すれば?
2018/07/09(月) 21:26:46.46ID:AazuLIX60
floatの配列は別に用意して

struct LOG {
uint32_t str_start;
uint32_t str_end;
uint32_t str_line;
uint32_t num_start;
uint32_t num_end;
};

みたいな、
ブロックごとの構造体に入れていく方がいいのかな?
2018/07/09(月) 21:27:53.33ID:jdPfoelBa
vector<pair<size_t, size_t>> baka;//stringの開始位置とint_to_floatの開始位置をペアで管理。
2018/07/09(月) 21:29:34.68ID:AazuLIX60
適切なデータの持ち方はUIの全体表示の仕様次第と言うことになる
2018/07/09(月) 21:33:55.24ID:AazuLIX60
>>806に対して反応が無いから
数値情報が事前に必要なのかと思ったが
2018/07/09(月) 21:36:11.40ID:jdPfoelBa
あと気になったのはGUIに表示するのはstringの一行目?
2018/07/09(月) 21:43:08.83ID:AazuLIX60
1ブロック平均500行
1行平均30文字
でも100万ブロックある

全体画面で文字列は表示しないんじゃ?
2018/07/09(月) 21:58:36.33ID:lKzPjQ7Y0
初回DBに突っ込む
初回レコードのインデックスを作る
2018/07/09(月) 22:41:30.68ID:Xc+Rjkat0
最低限のパースを実施して各レコードのオフセットを配列に入れて必要になった時に解析して表示すればいいだけかと
2018/07/09(月) 22:43:45.27ID:AazuLIX60
同じ事を何度も書かなくて良い
2018/07/09(月) 22:49:34.81ID:tJIkM3K40
やっとおまえらもXMLが糞遅い理由を理解したか。
2018/07/09(月) 23:26:25.24ID:Kh8JJTJK0
>>776
構文的に難しくも無いのにわざわざ遅くする理由がわからん…
ていうかそもそもlexとかyacc使いでも滅多に使わん希ガス

今回の文字列処理の件はワッチョイ 0780-Rmg1の圧勝
2018/07/10(火) 00:11:54.08ID:L9+HOK/Ta
>>851
テストまでしていただいだきありがとうございます。
1分ちょっとならとてもいい感じです。
なるほどDRAMよりも高速なCPU内のキャッシュを有効に使うと効果的ってことですね。
そんなこと今まで考えたこともなかったです。勉強になります。

>>854
ご推察の通りです。

>>857
文字列の方はせいぜい10行〜20行です。
数値の方は何万行にもなったりします。

>>858
メモリは10GBつかっても問題にならないくらい潤沢に使えると思うので、まずは速度重視で行こうと思っています。

>>861,862
すみません昨日書き込みエラーになって書き込めなかったのでそのままでした。
クリックするたびに毎回int->float演算したら1項目で何万行もあったりするので
読み込み時に演算しておいた方がよいかなと思っていました。

>つづきます
2018/07/10(火) 00:20:12.97ID:L9+HOK/Ta
>>863
全部のフォーマットは複雑になってくるので簡易的なフォーマットをと思って出していましたが
説明していくと細かい話になってきましたのでもう少し具体的なものを書きます。
テストまでしてもらっているのに変わってすみません。。
-------------------------------
SECTION_NAME @
11200 11200 2 Jun 9 23:23:00 2018 A
This is pen. B
hello world. B
x 1 2 C
100 1 -2000 10
101 10 -2001 10
y 2 4
-100 10000
-101 10100
x 3 28
QQ subname -1 0 0 1 -21000000 600000 2 D
100 100 110 110
100 100 110 110
〜あと26行〜
SECTION_NAME E

@GUI表示する
A11200がx or yの個数、3カラム目がテキスト行の個数、それ以降は捨てる。11200のところは1の時もあれば100万超えることもある
BGUI表示する
Cこれが非常に多く、ひたすら繰り返される。x,yはランダムでくる。
1カラム目はx or y固定。x=次行に来る数値は4カラム。y=2カラム
2カラム目は1からインクリメントしていき、Aの11200回出てくる。カウント数値
3カラム目は次行から始まる数値行が何行かの数値
Dx or yの次の行にたまにこの行があります。この行も使いますが、ちょっと複雑なのでまずはスキップで。
Eここからまた@の繰り返し、要するにファイルの最後はCのところで終わる。
-------------------------------
2018/07/10(火) 00:23:35.36ID:L9+HOK/Ta
すみません、上記QQはQQという固定文字です。
行頭が"Q"のときはこの行という判定で良いと思います。

>>859,860
格納先は構造体に入れようと思っていて、下記のようにテキスト行も入れようかなと思っていました。

struct x_or_y{
 char type; // x or y
 int num; // Cの2カラム目
 float list;
};
struct elem{
 char section_name;
 char comments;
 array系の何かの型 x_or_y_array; // 配列にしておくと(Cの2カラム目-1)で簡単にアクセスできそう
};
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況