質問編集履歴
7
まだ原因不明なので「動くようになりました」は撤去
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
試したことを追加しました(エラーは出なくなりましたが、自分が理解できてないので自己解決にはしません)
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
不足していたソースを追加しました
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
気になっていることを追加しました
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の結果を追加
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を追加しました(極秘システムなので全体までは入れてません)
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
ソースの添付ミスを修正しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -29,7 +29,8 @@
|
|
29
29
|
# ↓ここでNoMemoryError発生(する時としない時がある)
|
30
30
|
rstDataset.each() do |recDataset|
|
31
31
|
# ↑
|
32
|
-
|
32
|
+
strSQL = %Q{#{strSQL}#{recDataset["SQLLine"]}\n};
|
33
|
+
end
|
33
34
|
|
34
35
|
end
|
35
36
|
|