Итак, по какой-то странной причине я заканчиваю файл журнала размером 100 ГБ, который является несортированным (на самом деле он частично отсортирован), в то время как для алгоритмов, которые я пытаюсь применить, требуются отсортированные данные. Строка в файле журнала выглядит так
data <date> data data more data
У меня есть доступ к С# 4.0 и около 4 ГБ ОЗУ на моей рабочей станции. Я бы предположил, что какой-то вид слияния будет лучше всего, но не до конца реализовать эти алгоритмы - я хочу спросить, есть ли какой-нибудь ярлык, который я мог бы сделать.
Кстати, синтаксический анализ строки даты с помощью DateTime.Parse()
очень медленный и занимает много процессорного времени. Скорость прерывания составляет 10 МБ/с. Есть ли более быстрый способ, чем следующий?
public static DateTime Parse(string data)
{
int year, month, day;
int.TryParse(data.Substring(0, 4), out year);
int.TryParse(data.Substring(5, 2), out month);
int.TryParse(data.Substring(8, 2), out day);
return new DateTime(year, month, day);
}
Я написал, что для ускорения DateTime.Parse()
и он действительно работает хорошо, но по-прежнему берет нагрузку на циклы циклов.
Обратите внимание, что для текущего лог файла меня интересуют часы, минуты и секунды. Я знаю, что я могу предоставить DateTime.Parse() с форматом, но это, похоже, не ускоряет его.
Я ищу подталкивание в правильном направлении, спасибо заранее.
EDIT. Некоторые люди предположили, что я использую сравнение строк, чтобы сравнивать даты. Это будет работать для этапа сортировки, но мне нужно разобрать даты для алгоритмов. Я до сих пор не знаю, как сортировать файл 100 ГБ на 4 ГБ свободного бара, не делая его вручную.
EDIT 2. Хорошо, благодаря нескольким предложениям, которые я использую сортировку окон, я узнал, что есть аналогичный инструмент для Linux. В основном вы вызываете сортировку, и она исправляет все для вас. Когда мы говорим, что это что-то делает, и я надеюсь, что скоро это закончится. Команда, которую я использую,
sort -k 2b 2008.log > 2008.sorted.log
-k указывает, что я хочу сортировать во второй строке, которая является строкой даты в обычном формате YYYY-MM-DD hh:mm:ss.msek
. Должен признать, что man-страницы не объясняют все варианты, но я нашел много примеров, запустив info coreutils 'sort invocation'
.
Я отчитаю результаты и тайминги. Эта часть журнала составляет около 27 ГБ. Я думаю о сортировке в 2009 и 2010 годах отдельно, а затем слияние результатов в один файл с параметром sort -m.
Изменить 3 Ну, проверяя iotop, он предлагает, чтобы он читал небольшие куски файла данных, а затем яростно занимаясь чем-то, чтобы обработать их. Этот процесс кажется довольно медленным. = (
sort
не использует память и только одно ядро. Когда он считывает данные с диска, он ничего не обрабатывает. Я что-то делаю неправильно?
Изменить 4 Три часа, и он по-прежнему делает то же самое. Теперь я нахожусь на том этапе, где я хочу попробовать играть с параметрами функции, но я потратил три часа... Я остановлюсь примерно через 4 часа и постараюсь поместить его на ночь вычисления с умной памятью и пространственные параметры...
Изменить 5. Прежде чем я вернулся домой, я перезапустил процесс с помощью следующей команды:
sort -k 2b --buffer-size=60% -T ~/temp/ -T "/media/My Passport" 2010.log -o 2010.sorted.log
Он вернулся сегодня утром:
sort: write failed: /media/My Passport/sortQAUKdT: File too large
Wraawr! Я думал, что просто добавлю как можно больше жестких дисков, чтобы ускорить этот процесс. Судя по всему, добавление USB-накопителя было наихудшей идеей. На данный момент я не могу даже сказать, касается ли это FAT/NTFS или некоторых таких, потому что fdisk говорит мне, что USB-накопитель является "неправильным устройством"... не шутит. Я постараюсь дать ему еще один шаг позже, а теперь пусть этот проект попадет в неудачную кучу.
Заключительное уведомление На этот раз он работал с той же командой, что и выше, но без проблемного внешнего жесткого диска. Спасибо всем за вашу помощь!
Бенчмаркинг
Используя 2 жестких диска с памятью (минимум 70 Мбит/с IO) на одном и том же контроллере SATA, мне потребовалось 162 минуты, чтобы отсортировать файл журнала 30 ГБ. Мне нужно будет отсортировать еще 52 ГБ файла сегодня, я опубликую, как это происходит.