Как исправить JSON.load, вешающее приложение на рельсы? - PullRequest
0 голосов
/ 01 июля 2019

Я работаю над большим приложением рельсов. Существуют сотни различных функций поиска, и мы хотим посмотреть на поисковые данные, чтобы мы могли проанализировать, что ищут люди, и что мы можем улучшить. Я написал скрипт, который будет анализировать файлы журнала и сохранять результаты в файле 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.

Я ожидаю, что программа не зависнет или, по крайней мере, выдаст ошибку при загрузке файла. Вместо этого зависает все мое приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...