2009-04-16 2 views
2

У меня есть XML-файл размером 31 ГБ. Мне нужно найти общее количество строк в этом файле. Я знаю, что команда wc -l даст мне то же самое. Однако для выполнения этой операции слишком много времени. Есть ли более быстрый механизм для поиска количества строк в большом файле?Длина файла XML

+0

@Turing Complete: Это не обязательно вина OP в, может быть, он работает на прежней системе или что-то подобное. Вопрос верен и не заслуживает -1 – marcgg

ответ

6

31 концерта - действительно большой текстовый файл. Бьюсь об заклад, он сжимал бы около 1,5 концертов. Я бы начал создавать эти файлы в сжатом формате, чтобы начать с того, что вы можете передать распакованную версию файла через wc. Это значительно сократит объем ввода-вывода и памяти, используемых для обработки этого файла. gzip может читать и записывать сжатые потоки.

Но я хотел бы также сделать следующие замечания:

  • номер строк на самом деле не что информативный для XML как пробела между элементами игнорируются (для смешанного содержания, за исключением). Что вы действительно хотите узнать о наборе данных? Я считаю, что подсчет элементов будет более полезен.
  • Убедитесь, что ваш XML-файл не является излишне лишним, например, вы повторяете те же объявления пространства имен по всему документу?
  • Возможно, XML не является лучшим способом представить этот документ, если он поищите в нечто вроде Fast Infoset
+0

Хорошая идея о потоках gzipped. Мне было бы интересно увидеть влияние производительности (у меня нет файла с размером файла 31 Гб) –

4

Если вам нужно только количество строк, wc -l будет так же быстро, как и все остальное.

Проблема заключается в текстовом файле 31GB.

1

Нет, не совсем. wc будет очень хорошо оптимизирован. 31GB - это много данных, и чтение его для подсчета строк займет некоторое время независимо от того, какую программу вы используете.

Кроме того, этот вопрос не подходит для переполнения стека, поскольку речь идет не о программировании вообще.

+0

У вас всегда может быть решение для программирования –

3

Если точность не является проблемой, найдите среднюю длину линии и разделите ее на размер. Таким образом, вы можете получить очень быстрое приближение. (не забудьте рассмотреть используемую кодировку символов)

+0

Как вы можете найти среднюю длину строки без чтения всего файла? – harto

+0

Я просто думал о квалифицированной догадке или, возможно, когда-то делал какой-то статический анализ и использовал это значение. – sris

+0

@harto Пример файла при различных смещениях и экстраполяции. –

2

Это выходит за рамки того, где код должен быть реорганизован, чтобы полностью исключить вашу проблему. Один из способов сделать это - поместить все данные в файл в базу данных хранилища. Apache couchDB и Intersystems Cache - это две системы, которые вы могли бы использовать для этого, и будут намного лучше оптимизированы для типа данных, с которыми вы имеете дело.

Если вы действительно застряли в файле xml, то другой вариант - подсчитать все строки раньше времени и кешировать это значение. Каждый раз, когда строка добавляется или удаляется из файла, вы можете добавить или вычесть ее из файла. Кроме того, обязательно используйте 64-битное целое число, так как может быть более 2^32 строк.

1

Не считая строк довольно неопределенным, поскольку в XML-символе новой строки в основном просто косметическая вещь? Вероятно, лучше было бы подсчитать количество вхождений определенного тега.

Смежные вопросы