質問するログイン新規登録

質問編集履歴

7

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

2016/04/26 19:46

投稿

sirosiro
sirosiro

スコア26

title CHANGED
File without changes
body CHANGED
@@ -134,7 +134,7 @@
134
134
  Sinatraのウェブページ表示は@付きの変数に処理結果を入れて*.erbファイルから参照してウェブページに表示するというものです。自分の場合は変数を増やしたくないので@hshResultというハッシュに色々と追加して、ウェブページで表示をしております。
135
135
  どこかのサイトでrubyのHashに値を突っ込んでいくとメモリをどんどん消費して、何故かガベレージコレクタにも検知されず解放されない?というのを前に見た覚えがあります。自分は@hshResult = nil;することでメモリ解放をしているつもりなのですが、これはやり方としてあってますでしょうか?
136
136
 
137
- ###試したこと(結果動くようになりました)
137
+ ###試したこと
138
138
  debugSQL_display()でrstDataset.each()でselect結果を一度読み込んでいます。
139
139
  この読み込みを辞めるとエラーが発生しなくなりました。
140
140
  (読み込み結果をhashでarrayに入れてますがこの処理があってもなくてもエラーになります)

6

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

2016/04/26 19:46

投稿

sirosiro
sirosiro

スコア26

title CHANGED
File without changes
body CHANGED
@@ -114,8 +114,6 @@
114
114
  return lstDataset;
115
115
 
116
116
  end
117
-
118
-
119
117
  ```
120
118
 
121
119
  ###メモリの空き
@@ -127,17 +125,24 @@
127
125
 
128
126
  ```
129
127
 
130
- ###試したこと
128
+ ###気になっていること
131
129
  他のページではMySQLからselect文2回発行までは問題なく動いております。
132
130
  今回のページは4回発行の4回目で失敗しております。
133
131
  (必ず失敗するわけでもない)
134
132
  4回目のSQL発行を無くし3回のみにするとNoMemoryErrorは発生しなくなります。
135
133
 
136
- ###気になっていること
137
- Sinatraのウェブページ表示は@付きの変数に処理結果を入れて*.erbファイルから参照してウェブページに表示するというものです。
134
+ Sinatraのウェブページ表示は@付きの変数に処理結果を入れて*.erbファイルから参照してウェブページに表示するというものです。自分の場合は変数を増やしたくないので@hshResultというハッシュに色々と追加して、ウェブページで表示をしております。
138
- 自分の場合は変数を増やしたくないので@hshResultというハッシュに色々と追加して、ウェブページで表示をしております。
139
135
  どこかのサイトでrubyのHashに値を突っ込んでいくとメモリをどんどん消費して、何故かガベレージコレクタにも検知されず解放されない?というのを前に見た覚えがあります。自分は@hshResult = nil;することでメモリ解放をしているつもりなのですが、これはやり方としてあってますでしょうか?
140
136
 
137
+ ###試したこと(結果動くようになりました)
138
+ debugSQL_display()でrstDataset.each()でselect結果を一度読み込んでいます。
139
+ この読み込みを辞めるとエラーが発生しなくなりました。
140
+ (読み込み結果をhashでarrayに入れてますがこの処理があってもなくてもエラーになります)
141
+ つまり結果データセットのeach()を2回目に発行した場合にMySQLのgem内でメモリエラーが起きたり起きなかったりしているみたいです。
142
+
143
+ MySQLからの結果データセットをeach()で読み込んだ後、読み込み開始位置?が最後のレコードになっている状態で、再度each()を発行するとダメということでしょうか?そもそも根本的に結果データセットのeach()について自分が勘違いしているかも知れませんので、(動くようにはなりましたが)自己解決にはしないことにします。
144
+ どなたか詳しい方、ご教授お願い致します。
145
+
141
146
  ###補足情報(言語/FW/ツール等のバージョンなど)
142
147
  ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux-gnu]
143
148
  sinatra 1.4.5

5

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

2016/04/25 20:40

投稿

sirosiro
sirosiro

スコア26

title CHANGED
File without changes
body CHANGED
@@ -73,6 +73,49 @@
73
73
 
74
74
  end
75
75
 
76
+ # ###*********************************************************************###
77
+ # # debug sql
78
+ # ###*********************************************************************###
79
+
80
+ def debugSQL(strSQL, rstDataset)
81
+
82
+ if @flgDebug then
83
+
84
+ @hshResult.delete(:sql);
85
+ @hshResult[:sql] = strSQL;
86
+ @hshResult.delete(:dataset);
87
+ @hshResult[:dataset] = self.debugSQL_display(rstDataset);
88
+
89
+ end
90
+
91
+ end
92
+
93
+ # ###=====================================================================###
94
+ # # debug sql - display dataset
95
+ # ###=====================================================================###
96
+
97
+ def debugSQL_display(rstDataset)
98
+
99
+ lstDataset = Array.new();
100
+ if rstDataset != nil then
101
+ # ここから↓
102
+ rstDataset.each() do |recDataset|
103
+ recDataset.each() do |strKey, datValue|
104
+ hshRow = Hash.new();
105
+ hshRow[:key] = strKey;
106
+ hshRow[:value] = datValue.to_s();
107
+ lstDataset.push(hshRow);
108
+ end
109
+ break;
110
+ end
111
+ # ↑ここまでの処理を行わない時はエラーが起きない
112
+ end
113
+
114
+ return lstDataset;
115
+
116
+ end
117
+
118
+
76
119
  ```
77
120
 
78
121
  ###メモリの空き

4

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

2016/04/25 20:26

投稿

sirosiro
sirosiro

スコア26

title CHANGED
File without changes
body CHANGED
@@ -90,6 +90,11 @@
90
90
  (必ず失敗するわけでもない)
91
91
  4回目のSQL発行を無くし3回のみにするとNoMemoryErrorは発生しなくなります。
92
92
 
93
+ ###気になっていること
94
+ Sinatraのウェブページ表示は@付きの変数に処理結果を入れて*.erbファイルから参照してウェブページに表示するというものです。
95
+ 自分の場合は変数を増やしたくないので@hshResultというハッシュに色々と追加して、ウェブページで表示をしております。
96
+ どこかのサイトでrubyのHashに値を突っ込んでいくとメモリをどんどん消費して、何故かガベレージコレクタにも検知されず解放されない?というのを前に見た覚えがあります。自分は@hshResult = nil;することでメモリ解放をしているつもりなのですが、これはやり方としてあってますでしょうか?
97
+
93
98
  ###補足情報(言語/FW/ツール等のバージョンなど)
94
99
  ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux-gnu]
95
100
  sinatra 1.4.5

3

freeの結果を追加

2016/04/24 23:13

投稿

sirosiro
sirosiro

スコア26

title CHANGED
File without changes
body CHANGED
@@ -75,6 +75,15 @@
75
75
 
76
76
  ```
77
77
 
78
+ ###メモリの空き
79
+ ```console
80
+ total used free shared buffers cached
81
+ Mem: 16269900 3770256 12499644 0 294024 2722060
82
+ -/+ buffers/cache: 754172 15515728
83
+ Swap: 16609276 53336 16555940
84
+
85
+ ```
86
+
78
87
  ###試したこと
79
88
  他のページではMySQLからselect文2回発行までは問題なく動いております。
80
89
  今回のページは4回発行の4回目で失敗しております。

2

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

2016/04/24 23:08

投稿

sirosiro
sirosiro

スコア26

title CHANGED
File without changes
body CHANGED
@@ -9,6 +9,11 @@
9
9
  ```
10
10
  NoMemoryError
11
11
  failed to allocate memory
12
+
13
+ /magi/source/class/magiAdmin.rb:258:in `each'
14
+ /magi/source/class/magiAdmin.rb:258:in `fuckinMethod'
15
+ /magi/source/class/magiAdmin.rb:206:in `fuckin'
16
+ /magi/source/online/web/pgeIndex.rb:84:in `httpGetfuck'
12
17
  ```
13
18
 
14
19
  ###該当のソースコード

1

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

2016/04/24 23:00

投稿

sirosiro
sirosiro

スコア26

title CHANGED
File without changes
body CHANGED
@@ -29,7 +29,8 @@
29
29
  # ↓ここでNoMemoryError発生(する時としない時がある)
30
30
  rstDataset.each() do |recDataset|
31
31
  # ↑
32
- strSQL = %Q{#{strSQL}#{recDataset["SQLLine"]}\n};
32
+ strSQL = %Q{#{strSQL}#{recDataset["SQLLine"]}\n};
33
+ end
33
34
 
34
35
  end
35
36