Я работаю над большим приложением рельсов. Существуют сотни различных функций поиска, и мы хотим посмотреть на поисковые данные, чтобы мы могли проанализировать, что ищут люди, и что мы можем улучшить. Я написал скрипт, который будет анализировать файлы журнала и сохранять результаты в файле JSON, который затем можно будет манипулировать и визуализировать. Однако, когда я запускаю JSON.load
или JSON.parse
в моем контроллере, приложение зависает. Ошибка не выдается, но страницы не загружаются. Единственный способ убить приложение после попытки вызвать его - это запустить kill -9 <pid>
. Как я могу это исправить? В чем проблема?
Я уверен, что проблема в JSON.load/parse
, потому что, если я вызову исключение перед ним, оно будет отображаться, а исключение после него - нет. Я попытался добавить драгоценный камень json в свой Gemfile и включить его в приложение, но ничего не получалось. Вся кодировка правильная, а файл JSON имеет глубину всего около 8 слоев, поэтому я не думаю, что это проблема.
Это код, который создает хэш, который превращается в файл json:
File.foreach(log_file_path).with_index do |line, line_num|
#Getting time of search
if line_num + 2..3 == @lines_with_searches[index]
date_and_time = /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} -\d{4}/
temp_metadata[:line] = line_num
temp_metadata["time"] = line.match(date_and_time)[0] if line.match(date_and_time)
end
#Getting controller name and method
if line_num + 1 == @lines_with_searches[index]
#Fixes for missed times
if temp_metadata["time"].nil?
temp_metadata["time"] = prev_date_time
else
prev_date_time = temp_metadata["time"]
end
controller_name = /\w+#\w+/
controller = line.match(controller_name)[0] if line.match(controller_name)
if controller and @searches["search_info"].keys.include? controller
#Adding to existing search object
@searches["search_info"][controller]["num_searches"] += 1
elsif controller
#Setting up new search object
@searches["search_info"][controller] = {}
@searches["search_info"][controller]["num_searches"] = 1
@searches["search_info"][controller]["search_objs"] = []
else
#Implies a missed name
@searches["num_nameless"] += 1
end
end
#Getting search params and resetting for next match
if line_num == @lines_with_searches[index]
temp_metadata[:params] = eval(line.match(/\{.+\}/)[0])
@searches["search_info"][controller]["search_objs"] << temp_metadata
temp_metadata = {}
index += 1
end
end
Затем он превращается в json дальше с JSON.pretty_generate
- я пытался изменить это значение на .to_json
и JSON.generate
, но ни один из них не работал. @lines_with_searches
генерируется далее, просматривая файл и ища строки, которые содержат и «Параметры:», и «Поиск».
@search_data = JSON.load(File.read(Rails.root.to_s + "/script/out/search_log.json"))
Это код, который загружает файл JSON.
Я ожидаю, что программа не зависнет или, по крайней мере, выдаст ошибку при загрузке файла. Вместо этого зависает все мое приложение.