1 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 17:53:02.14 ID:FOAGvAbs.net] 次スレを立てる時は本文の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】 mevius.5ch.net/test/read.cgi/tech/1509780815/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) ----- テンプレ ここまで ----- VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 17:55:20.65 ID:FOAGvAbs.net] スレ作ってみましたが、これ設定間違ってますか? ワッチョイほにゃららが出てきてない。
3 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 18:42:45.47 ID:p9pW3bxe.net] >>1 乙 スレの立て方は一番上に書いてある。 前スレや関連スレへのリンクも間違ってるぞ。
4 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 18:59:13.88 ID:tzAF1ivs.net] ヘタクソかよ
5 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 20:33:07.04 .net] スレ立て苦手か?
6 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 20:48:45.99 ID:6fifTYMf.net] >>1 乙 ume
7 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 21:34:02.24 ID:xV7EJA5w.net] 前スレの 1N2GRIlb0 ディスクキャッシュに入ってるってずいぶん前からわかってたのに 何でムダな作業をやらせたの?
8 名前:デフォルトの名無しさん [2018/07/14(土) 21:38:31.07 ID:1N2GRIlb.net] このスレの知恵遅れたちが どんだけ頭悪いのかよおく分かっただろ 同じ計算機で2秒で終わるような読みこみ処理で 数十秒かかるとかいってたワケだからな 相当オツムが弱い このスレは知恵遅れしかいない
9 名前:デフォルトの名無しさん [2018/07/14(土) 21:41:09.27 ID:1N2GRIlb.net] いまになって 分かってたとかいいだしてるしな ディスク読む時間に知ったかぶって調子こいてた知恵遅れは どこいったの?
10 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 21:42:37.85 ID:xV7EJA5w.net] ん? 何度も指摘してたけど
11 名前:デフォルトの名無しさん [2018/07/14(土) 21:43:13.23 ID:1N2GRIlb.net] 嘘コケ ハゲ 知恵遅れは前のスレ読んで出直してこいや
12 名前:デフォルトの名無しさん [2018/07/14(土) 21:45:09.81 ID:1N2GRIlb.net] ハードディスクの内側読みこんで読みこみ時間がどうとかいってた バカいる?
13 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 21:45:30.57 ID:xV7EJA5w.net] 測らせるならキャッシュに無い状態にしないとアホだろ
14 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 21:46:18.02 ID:xV7EJA5w.net] はじめはキャッシュに入って無いんだから
15 名前:デフォルトの名無しさん [2018/07/14(土) 21:46:29.73 ID:1N2GRIlb.net] むしろなバカが指南した方法やコードでは キャッシュのっかても数十秒かかってたってことだぞ
16 名前:デフォルトの名無しさん [2018/07/14(土) 21:48:09.38 ID:1N2GRIlb.net] このスレで教えを乞うてるヤツは 何度もデバッグで走らせてるハズのに 知恵遅れの方法やコード数十秒かかるってことだ オレのは2秒かからない 知恵遅れは息してる?
17 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 21:48:37.29 ID:xV7EJA5w.net] 測定した結果は fgetsの17秒とreadの1〜2秒しか無い 普通に読むだけで数十秒なんて測定結果は無い
18 名前:デフォルトの名無しさん [2018/07/14(土) 21:49:17.53 ID:1N2GRIlb.net] 読み方次第で差は歴然と出る オレの方法は最適な方法だからな
19 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 21:50:16.06 ID:xV7EJA5w.net] fgetsは速いとか言ってなかった? 今遅いことが証明されてるのはfgetsだけ
20 名前:デフォルトの名無しさん [2018/07/14(土) 21:50:39.19 ID:1N2GRIlb.net] やっぱり知恵遅れはなにも分かってないわ まず自分が呼んでる関数がどんな動作してるか分かってないからな
21 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 21:51:14.96 ID:xV7EJA5w.net] 何の工夫もないただのreadで2秒なら、 他の方法も読むだけなら2秒
22 名前:デフォルトの名無しさん [2018/07/14(土) 21:51:37.65 ID:1N2GRIlb.net] やっぱりこのスレは 相当な知恵遅れしかいない CもC++も何も分かってない それ以前の問題
23 名前:デフォルトの名無しさん [2018/07/14(土) 21:53:57.67 ID:1N2GRIlb.net] 測定結果ででてるからな 相当な速度で速く読みこみたいのに標準関数のファイルポインタ使う知恵遅れなんか まずいない ファイルポインタ使う標準関数は このスレにいる知恵遅れにでも簡単に使えるように openやread使って使いやすく作ってあるだけだからな
24 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 21:54:36.27 ID:xV7EJA5w.net] fgetsが速いとか言ってたアホが readとfreadの差を強調する オーバーヘッドのオーダーは1 読み込みバッファが常識的なサイズであれば無視できる fgetsのオーバーヘッドのオーダーはn バッファサイズによらずオーバーヘッドは無視できない
25 名前:デフォルトの名無しさん [2018/07/14(土) 21:55:42.62 ID:1N2GRIlb.net] まずfreadもバッファもってるのすら分かってないからな
26 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 21:56:36.36 ID:xV7EJA5w.net] freadで測定させれば証明出来るが で、 もともと測りたかったディスクアクセスの時間は? まさかキャッシュに入った状態が普通と考えてるわけではあるまい
27 名前:デフォルトの名無しさん [2018/07/14(土) 21:56:51.40 ID:1N2GRIlb.net] ファイルポインタがもってるバッファから いちいちこっちのバッファにコピーしてんのに まずその程度のことすら分かってない
28 名前:デフォルトの名無しさん [2018/07/14(土) 21:57:27.49 ID:1N2GRIlb.net] 相当頭が悪いのが 知ったかぶってるのは分かる
29 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 21:58:58.41 ID:xV7EJA5w.net] 測って見ればわかるって で肝心の
30 名前:解析コードはどうした? 糞遅いコードを自信満々にあげてたけど [] [ここ壊れてます]
31 名前:デフォルトの名無しさん [2018/07/14(土) 22:00:01.80 ID:1N2GRIlb.net] クソ遅い? オレのコードを動かして速度測定したの? オレより10倍以上低速に作る才能がある知恵遅れのくせに
32 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 22:03:31.04 ID:xV7EJA5w.net] 糞遅い 間違い無い お前の環境で15GBのテキストを作って解析時間を測ってみな
33 名前:デフォルトの名無しさん [2018/07/14(土) 22:10:21.76 ID:1N2GRIlb.net] とりあえず 知恵遅れはほっといて テストデータをジェネレートするコードを 前スレの内容読んでテキトーに作った https://ideone.com/cPZvWL baka_genでコンパイルすれば大量のテストデータを作ってくれる優れものだ ※ 指定ギガバイト数越えたら、1つのセクション書ききったら停止する 使い方 Usage:baka_gen <fileparh> <GB size> 出力されてる形式に問題がないかみといてくれ 形式が分からないと解析処理を作りようがない 明日からこのテストデータを解析する処理を作る
34 名前:デフォルトの名無しさん [2018/07/14(土) 22:11:40.89 ID:1N2GRIlb.net] まず知恵億れはなにと比較して遅いとか書かないからな オレは知恵遅れが書いたコードより少なくとも10倍以上速い処理を書いてる
35 名前: mailto:sage [2018/07/14(土) 22:17:02.80 ID:CBXc6tpD.net] >>32 なんか error がいっぱい出ているようだが…
36 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 22:17:16.55 ID:xV7EJA5w.net] 15GBのテキストの解析で8.6秒 これを越えればいい
37 名前:デフォルトの名無しさん [2018/07/14(土) 22:17:46.97 ID:1N2GRIlb.net] なんのエラー書けよ エラーとかいわれても分かるワケがないだろ ヴォケ
38 名前:デフォルトの名無しさん [2018/07/14(土) 22:18:22.90 ID:1N2GRIlb.net] で、そのコードはったのかオマエは
39 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 22:19:29.69 ID:xV7EJA5w.net] >>33 fgets 17秒 これは俺じゃない キャッシュに入ったデータの読み込み時間 と ディスクからの読み込み時間 とを比べて10倍とか言ってるの?
40 名前: mailto:sage [2018/07/14(土) 22:19:38.05 ID:CBXc6tpD.net] >>36 >>32 https://ideone.com/cPZvWL の下の方にいっぱい書いてあるぞ?本当にコンパイルの通るコードなのか?
41 名前:デフォルトの名無しさん [2018/07/14(土) 22:20:14.44 ID:1N2GRIlb.net] 8.6秒とかテキトーなことなら なんとでもいえるからな どんなファイル読んで どんなソース作ったわけ? ファイル形式ちゃんとわかってんの
42 名前:デフォルトの名無しさん [2018/07/14(土) 22:22:08.48 ID:1N2GRIlb.net] 適切なインクルードファイルを上に書けば 間違いなく通る ココで教えを乞うているバカですら それぐらいのことやってる オマエはそれ未満だ
43 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 22:26:38.36 ID:xV7EJA5w.net] テキストのほとんどが数値の行 10%の割合でx, yの行 セクションは全部で100個くらい 数値は乱数で作成した 実際の分布を考えて、 桁数によって出現率を変えてある 異常データでも不正アクセスしない 文字コードはS-JIS 改行はLFのみ
44 名前: mailto:sage [2018/07/14(土) 22:27:16.82 ID:CBXc6tpD.net] >>41 「unknown type name ‘size_t’」がインクルードファイルで直る問題なのか? ideone に怒られないコードが書けないのか?
45 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 22:29:41.45 ID:xV7EJA5w.net] 数値は符号付き32bitに収まる値で printf("%d", n); で出力される文字列と同じ書式
46 名前:デフォルトの名無しさん [2018/07/14(土) 22:31:59.85 ID:1N2GRIlb.net] https://ideone.com/hi8bYd ヘッダファイルを適切にインクルードしたら 普通にエラーメッセージ消えたぞ バカはなにをいってるのか意味が分からないワケ
47 名前:デフォルトの名無しさん [2018/07/14(土) 22:33:55.81 ID:1N2GRIlb.net] なんか知恵遅れがバカみたいなレスをブ
48 名前:ツブツ書いてるし ごちゃごちゃいってないでコードあげたらどうだ [] [ここ壊れてます]
49 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 22:35:19.66 ID:xV7EJA5w.net] シングルスレッド、順番に全文字スキャンの処理で 処理時間は1文字平均約2クロック (Haswell) 最適化的にはこれが出発点 さらに高速化する価値がある処理であれば マルチスレッド,GPU, AVX ... まだまだ高速化の余地はある
50 名前:デフォルトの名無しさん [2018/07/14(土) 22:36:12.81 ID:1N2GRIlb.net] また知恵遅れがテキトーなこといってるしな
51 名前:デフォルトの名無しさん mailto:sage [2018/07/14(土) 23:49:17.06 ID:5xFWH4XP.net] 残念ながらクソシンタックスが増えれば増えるほどアホでもテクニカルターム使って アホと思われない活動が可能になって行くんだよ。
52 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 00:49:14.70 ID:p2p9fdhp.net] >>32 ,45 サンプルデータ作成コードありがとうございます。 実行してみましたが面白いですねこれ。 完成したら数十ギガのデータ作って遊んでみたい。 サンプルデータができて説明しやすくなったので色々補足させていただきます。 ちょっと細かい内容になるので、今あるサンプルデータ作成コードを 使用されても問題ありません。 文字コードはutf8 or euc-jpの両方を想定しています。 ファイルの1行目に下記行が一度だけ出てきます。 // タイトル、倍率(mag)。(この係数を使ってCの数値から割る、正の整数。unsigned int) ::fprintf(fp, "%s %d\x0a", "TITLE_NAME", 2000); 具体的には ttps://ideone.com/hi8bYd の64行目に上記が入ります。 Aのセクション集計値は個数が0のときがある。その時はテキスト行だけで終わり。 0 0 1 Jul〜 TEXT TEXT TEXT TEXT Bのテキスト行は日本語(2byte)が来ることがある。 >つづく
53 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 00:54:03.20 ID:p2p9fdhp.net] QQ行の説明 QQ subname -1 0 0 1 -21000000 600000 2 →この行が無いファイルもある。 →7,8カラムは1行目の倍率数字で割る(数値行と同じ計算) →3〜6カラムは -1, 0, 1, のいずれか。この4つの組み合わせであとで計算に使うことがある。 1 0 0 1 →TYPE_A 0 1 -1 0 →TYPE_B -1 0 0 -1 →TYPE_C 0 -1 1 0 →TYPE_D -1 0 0 1 →TYPE_E 0 -1 -1 0 →TYPE_F 1 0 0 -1 →TYPE_G 0 1 1 0 →TYPE_H →9カラム目は正の整数。(unsigned int) →下記6つのバリエーションがあります。 QQ subname QQ subname c QQ subname -1 0 0 1 -21000000 600000 QQ subname -1 0 0 1 -21000000 600000 2 QQ subname c -1 0 0 1 -21000000 600000 QQ subname c -1 0 0 1 -21000000 600000 2 ※cはcという文字列固定 ※1つのファイルに存在するのはいずれか1つのフォーマット そして少し複雑なのが、上記QQ行は先頭のQQがなくなってx, y行に存在することがあります。 1つのファイル内でQQ行とx, yの後ろにくるパターンの両方は存在せず、片方が出てきたらもう片方は出てきません。 x, yと同じ行にくる場合のフォーマットもQQ行の規則と同じです。 x 1 234 subname -1 0 0 1 -21000000 600000 2 y 2 234 subname -1 0 0 1 -21000000 600000 2 >つづく
54 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 00:58:25.78 ID:p2p9fdhp.net] 最後にRR行があります。 これもQQ同様x, yの次の行にあったりなかったりします。 QQとRRが一緒に出てくることは無いと思います。 フォーマットは「RR 正の整数」でQQのようにx,yの後ろに来ることはありません。 x 1 2 RR 3 11 11 11 11 11 11 11 11 ↓QQ、RRが一緒に出てくることは無い。 x 1 2 QQ subname c -1 0 0 1 -21000000 600000 RR 3 ↓これも無い x 1 2 RR 3 >つづく
55 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 01:02:10.59 ID:p2p9fdhp.net] 参考として、ファイルを読み込んだら下記のt_all_dbのような構造体にすべて保管しようと考えています。 型や名前は最適なものに変更されて問題ありませんし、他に最適な 格納方法があればそれでも問題ありません。 typedef struct __tag_rr_db { unsigned int rr_num; } t_rr_db; typedef struct __tag_qq_db { char qq_name; //subname bool is_c; //cがあるかないか QQ_TYPE qq_type; float numbers; // 2つの数字のリスト(vector?) unsigned int count; //最後尾の数字 } t_qq_db; typedef struct __tag_elem_db { ELEM_TYPE elem_type; // x or y unsigned int no; // x or yの番号 unsigned int num_line_count; t_qq_db qq_db; t_rr_db rr_db; numbers; //数値行のリスト(vector?) } t_elem_db; typedef struct __tag_section_db { unsigned char name; unsigned int num_1; unsigned int num_2; unsigned int text_line_count; texts; //テキスト行(vector?) t_elem_db elem_dbs; //elem_dbのリスト } t_section_db; typedef struct __tag_all_db { title_name; mag; section_dbs; //section_dbのリスト } t_all_db;
56 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 01:59:33.70 ID:lbsq5rUe.net] そろそろ「ぼくちんのログ解析ソフトを名無しどもに作らせるスレ」でも立ててそっちでやってくれないか
57 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 02:07:19.29 ID:eimWnm2X.net] いい加減にしろよお前 土方コーダに発注する気分でてめえのクソログの仕様ドヤ顔で書いてんじゃねえよ ありったけスレ私物化して相談しまくったんだからそろそろ自分の手と頭を動かしたらどうだ
58 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 02:58:06.76 ID:F1eG7opL.net] ID:p2p9fdhp さん、別のスレに移動を願います。
59 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 04:38:00.97 ID:deogSIs/.net] ume進行だと思えば悪くない 続けて ていうか徹底的にやれ ていうかディスクキャッシュのサイズと読込サイズの理想的な関係は微妙なもんじゃわ; HDD周りのキャッシュには次の3階層ある (1) 1トラック内のランダムアクセスではHDDだと平均的に1/2回転分の時間待たされるから、 HDD側であらかじめ1トラック分はキャッシュする (2) シークでは今日日のCPUの速度からみて地質年代レヴェルの遅延が生じるから、 OSにとって都合の良いサイズ(ページサイズとか)を単位とする単位でキャッシュされる (3) で、その上に標準入出力のバッファがある(setvbuf()で調整できるのはこれ SSDだと(1)が書き換え回数最適化絡みのキャッシュに置き換わるが、(2)や(3)は同じ 高速化には(3)のバッファリングやアプリ側の処理というものと、(2)と(1)のキャッシングをいかに並行動作させるかがキモすぐる fgets()とfread()の速度差は、単一ファイルをシーケンシャルアクセスするときは言うほど開きはない(上のしくみから導ける 一方、複数ファイルを交互にアクセスしたりHDDのまちまちな場所をランダムアクセスしだすとたちまち顕在化する(これも上のしくみから導ける 単一ファイルの読込であっても、アプリがファイルの一部を読み込んで考え込む、の繰り返しなパターンならば アプリ側のマルチスレッド化が有効な「こともある」 今回は該当しないと思うが、、
60 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 05:01:06.13 ID:EFpmUWpC.net] てな議論はベアメタルでやるならともかく 依存処理系では特定OSの話になるし 抽象化されたハードウエアじゃ特性を仮定すること自体ナンセンス
61 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 06:33:31.92 ID:F1eG7opL.net] >>57 申し訳ありませんが、C++と関係がない話は、他のスレでやってください。よろしくお願いします。 お気を悪くなされませんよう。
62 名前:デフォルトの名無しさん [2018/07/15(日) 11:31:30.36 ID:Y0/Ay92k.net] unsigned int l = -1; cout << l << endl; cout << (signed int)l << endl; ⇒ 4294967295 -1 int m = 4294967295; cout << m << endl; unsigned int n = 4294967295; cout << n << endl; ⇒ -1 4294967295
63 名前:デフォルトの名無しさん [2018/07/15(日) 11:32:24.73 ID:Y0/Ay92k.net] >>60 unsigned int l = -1; int m = 4294967295; がエラーにならないのはなぜでしょうか?
64 名前:デフォルトの名無しさん [2018/07/15(日) 11:45:15.02 ID:Y0/Ay92k.net] codepad.org/4odTQaly ↑は、ロベールの本に載っているコードです。 friend class ValueFactory; //friend Value* ValueFactory::New(int n) const; ↑これを friend class ValueFactory; //friend Value* ValueFactory::New(int n) const; と変更するとなぜコンパイルエラーになってしまうのでしょうか? ロベールの本には、「不完全型」というのを利用する必要があると書いてあります。 friend class ValueFactory; ↑これはなぜ「不完全型」を使わなくてもOKなのでしょうか?
65 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 11:51:25.65 ID:kDEFN2k+.net] 解釈が間違ってる ValueFactoryの実体を作って返すためにはすでに定義が分かってないといけない(完全型でないといけない 対してfriend宣言は名前だけ分かってればいい(定義がまだ無い(=不完全型)でいい というだけの話
66 名前:はちみつ餃子 mailto:sage [2018/07/15(日) 11:59:00.99 ID:HERu1+Fl.net] >>61 暗黙のキャストのせい。 整数リテラルに型を表す接尾辞がつかない場合は原則として int として解釈されるけど、 int の範囲より大きい場合はそれを表せる最低限の整数型として解釈されるんだったはず。 整数型の初期化 (代入) の右辺に現れた値が左辺の型で表せるときはそのままの値であることが保証されるが、 そうでないときは一定の規則に従って縮小される。 縮小の仕方は、 左辺が unsigned のときは、左辺の型が表せる最大値に 1 足した数で右辺の modulo を取った値が左辺に入る。 左辺が signed のときは未定義。 なので、 (int が 32 ビットの大きさをもつとき) unsigned int l = -1; が 4294967295 になるのは規格通りだが、 int m = 4294967295; が -1 になるのは保証されない。 規格を確認せずに記憶で書いてるので、 もし間違ってたら誰か指摘よろー。
67 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 12:01:48.69 ID:WB6myqsz.net] c++で文字列のバイナリ読み書きで質問があります vector<string> moji = {"aaaaaa", "bbbbbb", "ccccccccc"}; ofstream ofs2("mojibin.bin", std::ios_base::out | std::ios_base::binary); for (int i = 0; i <= 2; i++) { ofs2.write(moji[i].c_str(), strlen(moji[i].c_str())); } 書き込みは、エラー無くできるのですが ifstream ifs2("mojibin.bin", std::ios_base::out | std::ios_base::binary); for (int i = 0; i <= 2; i++) { ifs2.read((char*)&moji[i], strlen(moji[i].c_str())); cout << "(" << i << ")" << moji[i] << " "; } 読み込みは、読み込んで表示も出ますが 何かエラーが出ます どうしてでしょうか
68 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 12:06:41.50 ID:lbsq5rUe.net] 書き込んだものに区切り入れてないけどそれでいいの?
69 名前:デフォルトの名無しさん [2018/07/15(日) 12:11:00.69 ID:Y0/Ay92k.net] >>63 ありがとうございます。 ソースコード全体をコンパイラがみれば定義も分かるのに、なぜコンパイルエラーにするのでしょうか? >>64 ありがとうございました。
70 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 12:12:20.49 ID:Y0/Ay92k.net] >>63 例えば、 Python では、相互に参照していてもOKです。
71 名前:デフォルトの名無しさん [2018/07/15(日) 12:15:07.36 ID:Y0/Ay92k.net] コンパイラーについての知識がないと理解しにくい部分でしょうか?
72 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 12:15:22.56 ID:WB6myqsz.net] >>66 なにか、ヌル文字を読み込もうとしてるエラーのようで なるほど、区切り文字というのを入れて getlineとかを使用して読み込んでいくべきなのかな・・・・
73 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 12:50:13.08 ID:WB6myqsz.net] とりあえず、区切り入れてgetlineで一行ずつ読み込めました vector<string> moji = {"aaaaaa", "bbbbbb", "ccccccccc"}; ofstream ofs2("mojibin.bin", std::ios_base::out | std::ios_base::binary); for (int i = 0; i <= 2; i++) { moji[i] += "\n"; ofs2.write(moji[i].c_str(), strlen(moji[i].c_str())); } ifstream ifs2("mojibin.bin", std::ios_base::out | std::ios_base::binary); string temp; int i = 0; while (getline(ifs2, temp, '\n')) { cout << "(" << i << ")" << temp << " "; i++; } これでまたvector<string>に入れたらいいか c++はHSPとかと違って難しいですね
74 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 13:00:44.43 ID:oGr67yTf.net] >>70 &moji[i]はstringインスタンスの格納先アドレスであって、中に格納されている文字列データの先頭ではないよ。 無理やりやるなら ifs2.read(const_cast<char*>(&moji[i].data()), moji[i].length()); とかすれば動くと思うけど >>71 文字列以外も書き込みだしたら\nと競合するけどいいの? getline使うならbinaryモードは使うべきでないと思うし、そもそも文字列しか書き込まないならbinayモードにする必要ある?
75 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 13:02:49.96 ID:oGr67yTf.net] あとエラー出力は正確に書いてくれないと、コード全部読まないといけないからしんどいです…
76 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 13:18:02.66 ID:lbsq5rUe.net] >>67 C++はそういうコンパイルの仕方しないから cppごとにオブジェクトファイル(クラスのインスタンスとしてのオブジェクトとかとは別の意味)というのを作ってから オブジェクトファイル同士のリンクという作業をして目的の実行バイナリを作る オブジェクトファイルは自分自身で完結してないといけないので、 「ValueFactoryとかいうクラスのポインタ」「ValueFactoryとかいうクラスがfriendだという情報」は持つことが出来るけど (別のファイルがValueFactoryの実体を持ってると期待して) ValueFactoryの実体作れとか実体使ってなんかやれ(そういう実行コードを保持しろ)と言われたら困ってしまうってこと
77 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 13:19:42.19 ID:WB6myqsz.net] >>72 数字の配列はバイナリでエラー無いので やはり、文字列はテキストに出力したほうがいいんかな >>73 今度からはそうします すみませんでした
78 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 13:42:15.67 ID:oGr67yTf.net] もちろんバイナリ形式でもいいのだけど、その場合は文字列を固定長にするとか、tlv形式で作ってみては? https://en.m.wikipedia.org/wiki/Type-length-value
79 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 14:56:48.40 ID:p2p9fdhp.net] 大規模ファイルの読み込みについて相談しているものです。 以下調査結果です。 ファイルは上記で13GBのファイル生成したものを使用 https://ideone.com/hi8bYd @下記コードの結果 https://ideone.com/e9iA5m 512,15 →15秒 1024,7 →7秒 2048,5 →5秒 4096,3 →3秒 8192,2 →2秒 >つづく
80 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 14:58:34.48 ID:p2p9fdhp.net] A作成した下記コードでテスト。 →約2秒 https://ideone.com/1YhaLR (整理できておらず、かなりぐちゃぐちゃなコードですが。。) 内容:freadのみ B上記Aで、「#define READ_MODE 1」で実行 →約25秒 内容:改行単位にするため、前スレ962の下記Cを対応したつもりのもの A. 1行全体が連続してバッファに存在しなくてもいい作りにする B. リングバッファ C. fseekでファイルポインタを戻してから読み込む D. あまりをmemcpyでバッファの先頭にコピーしてから読み込む E. ほか C上記Aで、「#define READ_MODE 2」で実行 →約60秒 内容:上記B+解析 Dfgetsのみ →約15秒 if((fp=fopen(file_path, "r"))==NULL)
81 名前:{ printf("ファイルを開けません。%s",file_path); return 0; } char tdata[10000]; char* data = tdata; while( fgets(data,10000,fp) != NULL ){ data; } 上記Aが約2秒なのにBの改行単位のケアで25秒に増加しているので、 まずここの作りがおかしいんだろうなとは思いますが、 何がおかしいのかが、まだわかっていません。 [] [ここ壊れてます]
82 名前:デフォルトの名無しさん [2018/07/15(日) 16:27:56.77 ID:Y0/Ay92k.net] >>74 ありがとうございました。
83 名前:デフォルトの名無しさん [2018/07/15(日) 17:27:08.76 ID:1ys/w/8R.net] fseekをつかうのなんか絶対ダメだ fseekされることで標準関数がFILEポインタでもってるバッファも めんどいことになってるのが容易に想像がつく そしてさらにlseekもシステムコールも呼ばれる 標準関数の実装のされかたにもよるが 大きな性能劣化は避けられない Dの方法でひたすら シ リ ア ル に読まないと遅くなるのは当然 そんな標準関数でやってるようなことを、 こっち側でやるならそもそも標準関数使う意味がない 普通にopen、readでこっちが渡したメモリにそのまま読みこむほうがいい まずFILEポインタ使ってfreadしか使わないなら、はっきりいってfread使うメリットは まったくない 関係ないようで関係ある話だが キャッシュがきいてない状態ではposix_fadviceを呼んでおくと シ リ ア ル に大きなファイルを読み込むときには、計算機の状態によっては 劇的に改善することがある
84 名前:デフォルトの名無しさん [2018/07/15(日) 17:36:56.10 ID:1ys/w/8R.net] ちなみにファイルはUNIXでは ブロックデバイスだからな そのブロックデバイスをセクタ単位で 効率的に読み込むためにはどうすればいいか あとはもう分かるな このスレにいるサル並の知能しかないようなヤツラ以外なら わかるハズだからな
85 名前:デフォルトの名無しさん [2018/07/15(日) 18:02:19.58 ID:1ys/w/8R.net] まずストレージというハードウェアが OSでどうやって抽象化されてるか わかってないからな こんな頭悪いヤツラが抽象化とかなんとかいってるワケ きっとな前スレのソースの注釈で書いたwindowsで、キャッシュなしでReadFile呼ぶ時は セクタの倍数単位でないと使えないという意味も分かってない ともかくこのスレに居ついてるヤツラは頭悪い 基本的なことが分かってないからな まずなバカはこのスレで相談することが バカな行為であることに気付かないといけない バカななに聞いてもムダ 的外れなコタエしか返ってこない
86 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 18:16:38.79 ID:F1eG7opL.net] >>80 > FILEポインタ使ってfreadしか使わないなら、はっきりいってfread使うメリットはまったくない メリットはあるでしょ。システムコールのreadやReadFile()と違い、 FILE*を使ったfread()はアラインメントを無視した小さいバッファサイズで読み込んでも全体としての速度低下が起きにくい恩恵がある。
87 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 19:07:48.62 ID:lbsq5rUe.net] 13Gログ解析野郎と半角野郎が毎度毎度必ずコンビで出てくるのは何なんだろうなー おっかしいなー 「ぼくちんのログ解析ソフトをぼくちんが考えた最強の名無しが作るスレ」でやってどうぞ
88 名前:デフォルトの名無しさん [2018/07/15(日) 20:22:05.00 ID:1ys/w/8R.net] 低学歴で知能低いのが答えられる質問の範囲なんかたかがしれてる 知恵遅れでも回答できる質問に限定される こういうヤツラはYahoo知恵遅れがお似合い もうね2ちゃんねるのクオリティーも著しく低下したもんだわ 著しくレベルの低い質問なら回答できるワケだからな 情報として保存される価値すらない ゴミ質問とゴミ回答
89 名前:デフォルトの名無しさん [2018/07/15(日) 20:27:33.82 ID:1ys/w/8R.net] 昔ならググレカスでおわるような質問を どやがおで低学歴知恵遅れが回答するスレがココだからな 低学歴知恵遅れが活躍できる場所はココしかない オレのナワバリを荒らすなと低学歴知恵遅れが 主張
90 名前:している [] [ここ壊れてます]
91 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 20:39:19.46 ID:oGr67yTf.net] あぼーん設定推奨 [ヲ-゚]
92 名前:デフォルトの名無しさん [2018/07/15(日) 22:46:04.59 ID:GtfCPRC1.net] POSIXの制限に起因するパフォーマンス低下を回避するためのドライバをさっき見たばかりだな。 ハイパフォーマンスの世界にはそういうのもあるんだな。
93 名前:デフォルトの名無しさん mailto:sage [2018/07/15(日) 23:08:51.14 ID:ugn7dRUi.net] >>85 解析のコード書けたの? お前が全部作ってアップすればそれで終わる
94 名前:デフォルトの名無しさん [2018/07/16(月) 01:21:00.28 ID:6luw5g3K.net] とりあえずファイルすべての字句解析と 最低限のデータ取得できるとこまではできた ※ あとはデータを格納するだけ テストデータのジェネレータを修正した https://ideone.com/NWdMmL で、とりあえず作ってみた解析のコードが↓コレ https://ideone.com/E6QH2r プリプロセッサにDEBUG_WRITEの定義を追加してやれば データ取得できてることがダンプして確認できる ※ ダンプする場合は、ファイルにリダイレクトするにしても ※ 物凄い時間かかるし、物凄いディスク容量をとるから小さいテストデータでやるほうが ※ とりあえず無難 ものすごい単純なコードプロトタイプになってるから バカでもチョンでも簡単に整理や作りかえができるようにはなってる ※ 処理内容はコードみたまんまのハズだ ※ 同じような処理がひたすら書かれてる ※ QQがなくなればめっちゃコード減るハズ ※ コードのほとんどはQQのムダ処理
95 名前:デフォルトの名無しさん mailto:sage [2018/07/16(月) 01:37:37.27 ID:RYaEyvne.net] うわっ 汚いコード
96 名前:デフォルトの名無しさん mailto:sage [2018/07/16(月) 10:44:37.38 ID:526Z5Rhh.net] 15GBのテキスト解析8.6秒のマシンで >>90 の時間を計ったら54秒でした。 ファイルアクセスの時間は除いた純粋な解析処理です。 これがプロとアマチュアの差ですか。 まあ54秒でも使えるレベルではあると思うんで これで良いんじゃないですかね?
97 名前:デフォルトの名無しさん mailto:sage [2018/07/16(月) 11:29:13.12 ID:80hpbb9v.net] OS のAPI を、直接呼んではいけない。 例えば、1バイト読み込みを千回やれば、千回API が呼ばれる。 ユーザーモードからカーネルモードへの、コンテキストスイッチが千回 一方、バッファリングしている、C のライブラリを使えば、 千バイト1回の読み込みで済む ライブラリが抽象化している。 buffering stream ユーザー → (ライブラリ) → API
98 名前:デフォルトの名無しさん mailto:sage [2018/07/16(月) 11:39:40.02 ID:774eW9FT.net] >>90 今回相談しているものです。 ありがとうございます。 まず >>78 でAが2秒、Bが25秒の違いを調べました。 >>78 のBで実行するため昨日アップした https://ideone.com/1YhaLR に 「#define READ_MODE 1」を設定し25秒かかることを確認。 ここから後ろの処理からコメントアウトしていくと、下記行の前後で 25秒から2秒に変わりました。 88行目: data = real_data; real_data(char型)のポインタをdata(char型のポインタ)に代入したつもりだったのですが、 もしかして実体がコピーされているのでしょうか? >つづく
99 名前:デフォルトの名無しさん mailto:sage [2018/07/16(月) 11:41:24.00 ID:774eW9FT.net] 続けて >>90 のコードを実行してみました。 データ生成の方は、>>51 の最後に説明している、 「1つのファイル内でQQ行とx, yの後ろにくるパターンの両方は存在せず、片方が出てきたらもう片方は出てきません。」 というところで、1つのファイルに両方のフォーマットが生成されていましたが、 両方が読めれていれば特に問題はないと思います。 読み込み用のコードは自分の環境では %"PRIu64" → %" PRIu64 " とスペースを開けないとなぜかエラーになりました。 あとargv[2]がよくわかりませんでしたが実行できたのでとりあえずそのままにしています。 以下結果 ## 1GB time ./a.out aaa_1gb strat... ./a.out aaa_1gb (null) done... ./a.out aaa_1gb (null) 4./a.out aaa_1gb 3.69s user 0.14s system 99% cpu 3.839 total ## 5GB time ./a.out aaa_5gb strat... ./a.out aaa_5gb (null) done... ./a.out aaa_5gb (null) 18./a.out aaa_5gb 17.40s user 0.78s system 99% cpu 18.216 total ## 13GB time ./a.out aaa_13gb strat... ./a.out aaa_13gb (null) done... ./a.out aaa_13gb (null) 47./a.out aaa_13gb 44.99s user 1.73s system 99% cpu 46.781 total みなさんキャッシュの話をされていて、その辺がまだあまり理解できていないのですが、 文字列解析時にはキャッシュから取り出して参照するため時間は増えるということですかね。
100 名前:デフォルトの名無しさん mailto:sage [2018/07/16(月) 11:50:33.56 ID:774eW9FT.net] あと、freadだけで2秒のものに、freadの後にからなず fseek(fp, -10000, SEEK_CUR) を実行してみましたが、 処理時間は2秒で変わりはありませんでした。 これらのことから >>94 で書いている 88行目: data = real_data; のせいで2秒から25秒に増加しているようです。