|
1 | 1 | require 'json' |
2 | 2 | require 'date' |
| 3 | +require_relative 'memory_watcher' |
3 | 4 |
|
4 | 5 | class User |
5 | 6 | attr_reader :attributes, :sessions |
@@ -39,110 +40,118 @@ def collect_stats_from_users(report, users_objects, &block) |
39 | 40 | end |
40 | 41 | end |
41 | 42 |
|
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 | + |
43 | 49 | GC.disable if disable_gc |
44 | 50 |
|
45 | 51 | file_lines = File.read(file_path).split("\n") |
46 | 52 |
|
47 | 53 | users = [] |
48 | 54 | 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 |
49 | 64 |
|
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 } |
56 | 89 | end |
57 | | - end |
58 | 90 |
|
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 |
84 | 92 |
|
85 | | - report['uniqueBrowsersCount'] = uniqueBrowsers.count |
| 93 | + report['totalSessions'] = sessions.count |
86 | 94 |
|
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(',') |
88 | 102 |
|
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 = [] |
96 | 105 |
|
97 | | - # Статистика по пользователям |
98 | | - users_objects = [] |
| 106 | + sessions_by_user = sessions.group_by { |session| session['user_id'] } |
99 | 107 |
|
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 |
101 | 114 |
|
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'] = {} |
108 | 116 |
|
109 | | - report['usersStats'] = {} |
| 117 | + # Собираем количество сессий по пользователям |
| 118 | + collect_stats_from_users(report, users_objects) do |user| |
| 119 | + { 'sessionsCount' => user.sessions.count } |
| 120 | + end |
110 | 121 |
|
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 |
115 | 126 |
|
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 |
120 | 131 |
|
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 |
125 | 136 |
|
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 |
130 | 141 |
|
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 |
135 | 146 |
|
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 |
140 | 151 |
|
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 |
144 | 156 | 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) |
148 | 157 | end |
0 commit comments