Skip to content

Commit 7c112e0

Browse files
committed
added MemoryWatcher
1 parent 1a16afa commit 7c112e0

File tree

2 files changed

+116
-82
lines changed

2 files changed

+116
-82
lines changed

memory_watcher.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class MemoryWatcher
2+
def initialize(memory_limit_mb)
3+
@memory_limit_mb = memory_limit_mb
4+
@should_stop = false
5+
end
6+
7+
def start
8+
@thread = Thread.new do
9+
until @should_stop
10+
current_memory = `ps -o rss= -p #{Process.pid}`.to_i / 1024
11+
if current_memory > @memory_limit_mb
12+
puts "Memory limit exceeded: #{current_memory}MB > #{@memory_limit_mb}MB"
13+
puts "Killing process..."
14+
Process.kill('KILL', Process.pid)
15+
end
16+
sleep 1
17+
end
18+
end
19+
end
20+
21+
def stop
22+
@should_stop = true
23+
@thread.join if @thread
24+
end
25+
end

task-2.rb

Lines changed: 91 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require 'json'
22
require 'date'
3+
require_relative 'memory_watcher'
34

45
class User
56
attr_reader :attributes, :sessions
@@ -39,110 +40,118 @@ def collect_stats_from_users(report, users_objects, &block)
3940
end
4041
end
4142

42-
def work(file_path = 'data.txt', disable_gc = false)
43+
def work(file_path = 'data.txt', disable_gc = false, memory_watcher = false)
44+
if memory_watcher
45+
memory_watcher = MemoryWatcher.new(70)
46+
memory_watcher.start
47+
end
48+
4349
GC.disable if disable_gc
4450

4551
file_lines = File.read(file_path).split("\n")
4652

4753
users = []
4854
sessions = []
55+
begin
56+
file_lines.each do |line|
57+
case
58+
when line.start_with?('user,')
59+
users << parse_user(line)
60+
when line.start_with?('session,')
61+
sessions << parse_session(line)
62+
end
63+
end
4964

50-
file_lines.each do |line|
51-
case
52-
when line.start_with?('user,')
53-
users << parse_user(line)
54-
when line.start_with?('session,')
55-
sessions << parse_session(line)
65+
# Отчёт в json
66+
# - Сколько всего юзеров +
67+
# - Сколько всего уникальных браузеров +
68+
# - Сколько всего сессий +
69+
# - Перечислить уникальные браузеры в алфавитном порядке через запятую и капсом +
70+
#
71+
# - По каждому пользователю
72+
# - сколько всего сессий +
73+
# - сколько всего времени +
74+
# - самая длинная сессия +
75+
# - браузеры через запятую +
76+
# - Хоть раз использовал IE? +
77+
# - Всегда использовал только Хром? +
78+
# - даты сессий в порядке убывания через запятую +
79+
80+
report = {}
81+
82+
report[:totalUsers] = users.count
83+
84+
# Подсчёт количества уникальных браузеров
85+
uniqueBrowsers = []
86+
sessions.each do |session|
87+
browser = session['browser']
88+
uniqueBrowsers += [browser] if uniqueBrowsers.all? { |b| b != browser }
5689
end
57-
end
5890

59-
# Отчёт в json
60-
# - Сколько всего юзеров +
61-
# - Сколько всего уникальных браузеров +
62-
# - Сколько всего сессий +
63-
# - Перечислить уникальные браузеры в алфавитном порядке через запятую и капсом +
64-
#
65-
# - По каждому пользователю
66-
# - сколько всего сессий +
67-
# - сколько всего времени +
68-
# - самая длинная сессия +
69-
# - браузеры через запятую +
70-
# - Хоть раз использовал IE? +
71-
# - Всегда использовал только Хром? +
72-
# - даты сессий в порядке убывания через запятую +
73-
74-
report = {}
75-
76-
report[:totalUsers] = users.count
77-
78-
# Подсчёт количества уникальных браузеров
79-
uniqueBrowsers = []
80-
sessions.each do |session|
81-
browser = session['browser']
82-
uniqueBrowsers += [browser] if uniqueBrowsers.all? { |b| b != browser }
83-
end
91+
report['uniqueBrowsersCount'] = uniqueBrowsers.count
8492

85-
report['uniqueBrowsersCount'] = uniqueBrowsers.count
93+
report['totalSessions'] = sessions.count
8694

87-
report['totalSessions'] = sessions.count
95+
report['allBrowsers'] =
96+
sessions
97+
.map { |s| s['browser'] }
98+
.map { |b| b.upcase }
99+
.sort
100+
.uniq
101+
.join(',')
88102

89-
report['allBrowsers'] =
90-
sessions
91-
.map { |s| s['browser'] }
92-
.map { |b| b.upcase }
93-
.sort
94-
.uniq
95-
.join(',')
103+
# Статистика по пользователям
104+
users_objects = []
96105

97-
# Статистика по пользователям
98-
users_objects = []
106+
sessions_by_user = sessions.group_by { |session| session['user_id'] }
99107

100-
sessions_by_user = sessions.group_by { |session| session['user_id'] }
108+
users.each do |user|
109+
attributes = user
110+
user_sessions = sessions_by_user[user['id']] || []
111+
user_object = User.new(attributes: attributes, sessions: user_sessions)
112+
users_objects << user_object
113+
end
101114

102-
users.each do |user|
103-
attributes = user
104-
user_sessions = sessions_by_user[user['id']] || []
105-
user_object = User.new(attributes: attributes, sessions: user_sessions)
106-
users_objects << user_object
107-
end
115+
report['usersStats'] = {}
108116

109-
report['usersStats'] = {}
117+
# Собираем количество сессий по пользователям
118+
collect_stats_from_users(report, users_objects) do |user|
119+
{ 'sessionsCount' => user.sessions.count }
120+
end
110121

111-
# Собираем количество сессий по пользователям
112-
collect_stats_from_users(report, users_objects) do |user|
113-
{ 'sessionsCount' => user.sessions.count }
114-
end
122+
# Собираем количество времени по пользователям
123+
collect_stats_from_users(report, users_objects) do |user|
124+
{ 'totalTime' => user.sessions.map {|s| s['time']}.map {|t| t.to_i}.sum.to_s + ' min.' }
125+
end
115126

116-
# Собираем количество времени по пользователям
117-
collect_stats_from_users(report, users_objects) do |user|
118-
{ 'totalTime' => user.sessions.map {|s| s['time']}.map {|t| t.to_i}.sum.to_s + ' min.' }
119-
end
127+
# Выбираем самую длинную сессию пользователя
128+
collect_stats_from_users(report, users_objects) do |user|
129+
{ 'longestSession' => user.sessions.map {|s| s['time']}.map {|t| t.to_i}.max.to_s + ' min.' }
130+
end
120131

121-
# Выбираем самую длинную сессию пользователя
122-
collect_stats_from_users(report, users_objects) do |user|
123-
{ 'longestSession' => user.sessions.map {|s| s['time']}.map {|t| t.to_i}.max.to_s + ' min.' }
124-
end
132+
# Браузеры пользователя через запятую
133+
collect_stats_from_users(report, users_objects) do |user|
134+
{ 'browsers' => user.sessions.map {|s| s['browser']}.map {|b| b.upcase}.sort.join(', ') }
135+
end
125136

126-
# Браузеры пользователя через запятую
127-
collect_stats_from_users(report, users_objects) do |user|
128-
{ 'browsers' => user.sessions.map {|s| s['browser']}.map {|b| b.upcase}.sort.join(', ') }
129-
end
137+
# Хоть раз использовал IE?
138+
collect_stats_from_users(report, users_objects) do |user|
139+
{ 'usedIE' => user.sessions.map{|s| s['browser']}.any? { |b| b.upcase =~ /INTERNET EXPLORER/ } }
140+
end
130141

131-
# Хоть раз использовал IE?
132-
collect_stats_from_users(report, users_objects) do |user|
133-
{ 'usedIE' => user.sessions.map{|s| s['browser']}.any? { |b| b.upcase =~ /INTERNET EXPLORER/ } }
134-
end
142+
# Всегда использовал только Chrome?
143+
collect_stats_from_users(report, users_objects) do |user|
144+
{ 'alwaysUsedChrome' => user.sessions.map{|s| s['browser']}.all? { |b| b.upcase =~ /CHROME/ } }
145+
end
135146

136-
# Всегда использовал только Chrome?
137-
collect_stats_from_users(report, users_objects) do |user|
138-
{ 'alwaysUsedChrome' => user.sessions.map{|s| s['browser']}.all? { |b| b.upcase =~ /CHROME/ } }
139-
end
147+
# Даты сессий через запятую в обратном порядке в формате iso8601
148+
collect_stats_from_users(report, users_objects) do |user|
149+
{ 'dates' => user.sessions.map{|s| s['date']}.sort.reverse }
150+
end
140151

141-
# Даты сессий через запятую в обратном порядке в формате iso8601
142-
collect_stats_from_users(report, users_objects) do |user|
143-
{ 'dates' => user.sessions.map{|s| s['date']}.sort.reverse }
152+
File.write('result.json', "#{report.to_json}\n")
153+
puts "MEMORY USAGE: %d MB" % (`ps -o rss= -p #{Process.pid}`.to_i / 1024)
154+
ensure
155+
memory_watcher.stop if memory_watcher
144156
end
145-
146-
File.write('result.json', "#{report.to_json}\n")
147-
puts "MEMORY USAGE: %d MB" % (`ps -o rss= -p #{Process.pid}`.to_i / 1024)
148157
end

0 commit comments

Comments
 (0)