Парсинг текстового файла в Java

консоль 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')
14
задан Erno 20 October 2011 в 13:50
поделиться

4 ответа

Похоже, вы делаете что-то не так со мной - происходит создание целого множества объектов.

Насколько это представительно " тестовый "файл? Что вы на самом деле делаете с этими данными? Если это типично для того, что у вас действительно есть, я бы сказал, что в этих данных много повторений.

Если все равно все будет в строках, начните с BufferedReader для чтения каждой строки. Предварительно выделите этот список до размера, близкого к тому, что вам нужно, чтобы не тратить ресурсы на добавление к нему каждый раз. Разделите каждую из этих строк запятыми; обязательно удалите двойные кавычки.

Вы можете спросить себя: «Зачем мне нужен весь этот файл в памяти сразу?» Можете ли вы немного прочитать, немного обработать и никогда не запомнить все сразу? Только вы достаточно хорошо знаете свою проблему, чтобы ответить.

Может быть, вы сможете запустить jvisualvm, если у вас JDK 6, и посмотреть, что происходит с памятью. Это было бы отличной подсказкой.

9
ответ дан 1 December 2019 в 08:17
поделиться

Я не уверен, как эффективен с точки зрения памяти, но мой первый подход будет использовать Scanner , поскольку он невероятно прост в использовании:

13
ответ дан 1 December 2019 в 08:17
поделиться

Похоже, у вас в настоящее время есть 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();
}
4
ответ дан 1 December 2019 в 08:17
поделиться

Если у вас есть 200000000 символьных файлов и разбить их каждые пять символов, у вас будет 40 000 000 String объектов. Предположим, они совместно используют фактические символьные данные с исходной строкой размером 400 МБ ( char составляет 2 байта). Строка , скажем, 32 байта, то есть 1 280 000 000 байтов объектов String .

(Вероятно, стоит отметить, что это очень зависит от реализации. split может создавать полностью строки с совершенно новой поддержкой char [] или, OTOH, разделять некоторые общие значения String . Некоторые реализации Java не используют нарезку char [] . Некоторые могут использовать компактную форму, подобную UTF-8, и давать очень низкое время произвольного доступа.)

Даже предполагая более длинные строки, это ' са много объектов. Имея такой объем данных, вы, вероятно, захотите работать с большей частью в компактной форме, как оригинал (только с индексами). Преобразуйте в объекты только то, что вам нужно. Реализация должна быть похожа на базу данных (хотя они традиционно не обрабатывают строки переменной длины эффективно).

2
ответ дан 1 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: