консоль rails никогда не записывает в файл журнала, но вы можете достичь этого довольно легко, например, если вы выполните следующую команду после запуска консоли rails
ActiveRecord::Base.logger = Logger.new STDOUT
rails будут записывать все операторы SQL в стандартный вывод , таким образом, отобразить их в вашем терминале. и поскольку Logger.new
принимает любой поток в качестве первого аргумента, вы можете просто позволить ему записать в rails development.log:
ActiveRecord::Base.logger = Logger.new File.open('log/development.log', 'a')
Похоже, вы делаете что-то не так со мной - происходит создание целого множества объектов.
Насколько это представительно " тестовый "файл? Что вы на самом деле делаете с этими данными? Если это типично для того, что у вас действительно есть, я бы сказал, что в этих данных много повторений.
Если все равно все будет в строках, начните с BufferedReader для чтения каждой строки. Предварительно выделите этот список до размера, близкого к тому, что вам нужно, чтобы не тратить ресурсы на добавление к нему каждый раз. Разделите каждую из этих строк запятыми; обязательно удалите двойные кавычки.
Вы можете спросить себя: «Зачем мне нужен весь этот файл в памяти сразу?» Можете ли вы немного прочитать, немного обработать и никогда не запомнить все сразу? Только вы достаточно хорошо знаете свою проблему, чтобы ответить.
Может быть, вы сможете запустить jvisualvm, если у вас JDK 6, и посмотреть, что происходит с памятью. Это было бы отличной подсказкой.
Я не уверен, как эффективен с точки зрения памяти, но мой первый подход будет использовать Scanner , поскольку он невероятно прост в использовании:
Похоже, у вас в настоящее время есть 3 копии всего файла в памяти: байтовый массив, строка и массив строк.
Вместо чтения байтов в байт array, а затем преобразовать в символы с помощью new String ()
, было бы лучше использовать InputStreamReader, который будет преобразовывать в символы постепенно, а не все сразу.
Кроме того, вместо использования String. split ("\ n"), чтобы получить отдельные строки, вы должны читать по одной строке за раз. Вы можете использовать метод readLine ()
в BufferedReader
.
Попробуйте что-то вроде этого:
BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream, "UTF-8"));
try {
while (true) {
String line = reader.readLine();
if (line == null) break;
String[] fields = line.split(",");
// process fields here
}
} finally {
reader.close();
}
Если у вас есть 200000000 символьных файлов и разбить их каждые пять символов, у вас будет 40 000 000 String
объектов. Предположим, они совместно используют фактические символьные данные с исходной строкой размером 400 МБ
( char
составляет 2 байта). Строка
, скажем, 32 байта, то есть 1 280 000 000 байтов объектов String
.
(Вероятно, стоит отметить, что это очень зависит от реализации. split
может создавать полностью строки с совершенно новой поддержкой char []
или, OTOH, разделять некоторые общие значения String
. Некоторые реализации Java не используют нарезку char []
. Некоторые могут использовать компактную форму, подобную UTF-8, и давать очень низкое время произвольного доступа.)
Даже предполагая более длинные строки, это ' са много объектов. Имея такой объем данных, вы, вероятно, захотите работать с большей частью в компактной форме, как оригинал (только с индексами). Преобразуйте в объекты только то, что вам нужно. Реализация должна быть похожа на базу данных (хотя они традиционно не обрабатывают строки переменной длины эффективно).