質問編集履歴

7

まだ原因不明なので「動くようになりました」は撤去

2016/04/26 19:46

投稿

sirosiro
sirosiro

スコア26

test CHANGED
File without changes
test CHANGED
@@ -270,7 +270,7 @@
270
270
 
271
271
 
272
272
 
273
- ###試したこと(結果動くようになりました)
273
+ ###試したこと
274
274
 
275
275
  debugSQL_display()でrstDataset.each()でselect結果を一度読み込んでいます。
276
276
 

6

試したことを追加しました(エラーは出なくなりましたが、自分が理解できてないので自己解決にはしません)

2016/04/26 19:46

投稿

sirosiro
sirosiro

スコア26

test CHANGED
File without changes
test CHANGED
@@ -230,10 +230,6 @@
230
230
 
231
231
  end
232
232
 
233
-
234
-
235
-
236
-
237
233
  ```
238
234
 
239
235
 
@@ -256,7 +252,7 @@
256
252
 
257
253
 
258
254
 
259
- ###試したこと
255
+ ###気になっていること
260
256
 
261
257
  他のページではMySQLからselect文2回発行までは問題なく動いております。
262
258
 
@@ -268,16 +264,30 @@
268
264
 
269
265
 
270
266
 
271
- ###気になっていること
272
-
273
- Sinatraのウェブページ表示は@付きの変数に処理結果を入れて*.erbファイルから参照してウェブページに表示するというものです。
267
+ Sinatraのウェブページ表示は@付きの変数に処理結果を入れて*.erbファイルから参照してウェブページに表示するというものです。自分の場合は変数を増やしたくないので@hshResultというハッシュに色々と追加して、ウェブページで表示をしております。
274
-
275
- 自分の場合は変数を増やしたくないので@hshResultというハッシュに色々と追加して、ウェブページで表示をしております。
276
268
 
277
269
  どこかのサイトでrubyのHashに値を突っ込んでいくとメモリをどんどん消費して、何故かガベレージコレクタにも検知されず解放されない?というのを前に見た覚えがあります。自分は@hshResult = nil;することでメモリ解放をしているつもりなのですが、これはやり方としてあってますでしょうか?
278
270
 
279
271
 
280
272
 
273
+ ###試したこと(結果動くようになりました)
274
+
275
+ debugSQL_display()でrstDataset.each()でselect結果を一度読み込んでいます。
276
+
277
+ この読み込みを辞めるとエラーが発生しなくなりました。
278
+
279
+ (読み込み結果をhashでarrayに入れてますがこの処理があってもなくてもエラーになります)
280
+
281
+ つまり結果データセットのeach()を2回目に発行した場合にMySQLのgem内でメモリエラーが起きたり起きなかったりしているみたいです。
282
+
283
+
284
+
285
+ MySQLからの結果データセットをeach()で読み込んだ後、読み込み開始位置?が最後のレコードになっている状態で、再度each()を発行するとダメということでしょうか?そもそも根本的に結果データセットのeach()について自分が勘違いしているかも知れませんので、(動くようにはなりましたが)自己解決にはしないことにします。
286
+
287
+ どなたか詳しい方、ご教授お願い致します。
288
+
289
+
290
+
281
291
  ###補足情報(言語/FW/ツール等のバージョンなど)
282
292
 
283
293
  ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux-gnu]

5

不足していたソースを追加しました

2016/04/25 20:40

投稿

sirosiro
sirosiro

スコア26

test CHANGED
File without changes
test CHANGED
@@ -148,6 +148,92 @@
148
148
 
149
149
 
150
150
 
151
+ # ###*********************************************************************###
152
+
153
+ # # debug sql
154
+
155
+ # ###*********************************************************************###
156
+
157
+
158
+
159
+ def debugSQL(strSQL, rstDataset)
160
+
161
+
162
+
163
+ if @flgDebug then
164
+
165
+
166
+
167
+ @hshResult.delete(:sql);
168
+
169
+ @hshResult[:sql] = strSQL;
170
+
171
+ @hshResult.delete(:dataset);
172
+
173
+ @hshResult[:dataset] = self.debugSQL_display(rstDataset);
174
+
175
+
176
+
177
+ end
178
+
179
+
180
+
181
+ end
182
+
183
+
184
+
185
+ # ###=====================================================================###
186
+
187
+ # # debug sql - display dataset
188
+
189
+ # ###=====================================================================###
190
+
191
+
192
+
193
+ def debugSQL_display(rstDataset)
194
+
195
+
196
+
197
+ lstDataset = Array.new();
198
+
199
+ if rstDataset != nil then
200
+
201
+ # ここから↓
202
+
203
+ rstDataset.each() do |recDataset|
204
+
205
+ recDataset.each() do |strKey, datValue|
206
+
207
+ hshRow = Hash.new();
208
+
209
+ hshRow[:key] = strKey;
210
+
211
+ hshRow[:value] = datValue.to_s();
212
+
213
+ lstDataset.push(hshRow);
214
+
215
+ end
216
+
217
+ break;
218
+
219
+ end
220
+
221
+ # ↑ここまでの処理を行わない時はエラーが起きない
222
+
223
+ end
224
+
225
+
226
+
227
+ return lstDataset;
228
+
229
+
230
+
231
+ end
232
+
233
+
234
+
235
+
236
+
151
237
  ```
152
238
 
153
239
 

4

気になっていることを追加しました

2016/04/25 20:26

投稿

sirosiro
sirosiro

スコア26

test CHANGED
File without changes
test CHANGED
@@ -182,6 +182,16 @@
182
182
 
183
183
 
184
184
 
185
+ ###気になっていること
186
+
187
+ Sinatraのウェブページ表示は@付きの変数に処理結果を入れて*.erbファイルから参照してウェブページに表示するというものです。
188
+
189
+ 自分の場合は変数を増やしたくないので@hshResultというハッシュに色々と追加して、ウェブページで表示をしております。
190
+
191
+ どこかのサイトでrubyのHashに値を突っ込んでいくとメモリをどんどん消費して、何故かガベレージコレクタにも検知されず解放されない?というのを前に見た覚えがあります。自分は@hshResult = nil;することでメモリ解放をしているつもりなのですが、これはやり方としてあってますでしょうか?
192
+
193
+
194
+
185
195
  ###補足情報(言語/FW/ツール等のバージョンなど)
186
196
 
187
197
  ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux-gnu]

3

freeの結果を追加

2016/04/24 23:13

投稿

sirosiro
sirosiro

スコア26

test CHANGED
File without changes
test CHANGED
@@ -152,6 +152,24 @@
152
152
 
153
153
 
154
154
 
155
+ ###メモリの空き
156
+
157
+ ```console
158
+
159
+ total used free shared buffers cached
160
+
161
+ Mem: 16269900 3770256 12499644 0 294024 2722060
162
+
163
+ -/+ buffers/cache: 754172 15515728
164
+
165
+ Swap: 16609276 53336 16555940
166
+
167
+
168
+
169
+ ```
170
+
171
+
172
+
155
173
  ###試したこと
156
174
 
157
175
  他のページではMySQLからselect文2回発行までは問題なく動いております。

2

stacktraceを追加しました(極秘システムなので全体までは入れてません)

2016/04/24 23:08

投稿

sirosiro
sirosiro

スコア26

test CHANGED
File without changes
test CHANGED
@@ -19,6 +19,16 @@
19
19
  NoMemoryError
20
20
 
21
21
  failed to allocate memory
22
+
23
+
24
+
25
+ /magi/source/class/magiAdmin.rb:258:in `each'
26
+
27
+ /magi/source/class/magiAdmin.rb:258:in `fuckinMethod'
28
+
29
+ /magi/source/class/magiAdmin.rb:206:in `fuckin'
30
+
31
+ /magi/source/online/web/pgeIndex.rb:84:in `httpGetfuck'
22
32
 
23
33
  ```
24
34
 

1

ソースの添付ミスを修正しました。

2016/04/24 23:00

投稿

sirosiro
sirosiro

スコア26

test CHANGED
File without changes
test CHANGED
@@ -60,7 +60,9 @@
60
60
 
61
61
  # ↑
62
62
 
63
- strSQL = %Q{#{strSQL}#{recDataset["SQLLine"]}\n};
63
+ strSQL = %Q{#{strSQL}#{recDataset["SQLLine"]}\n};
64
+
65
+ end
64
66
 
65
67
 
66
68