мы используем ZyWall для защиты наших серверов от внешних вторжений. Он генерирует файлы ежедневных журналов огромных размеров, более ГБ, иногда 2 ГБ. Обычно они содержат более 10 миллионов строк. Теперь моя задача написать приложение, которое будет импортировать эти строки в базу данных Oracle. Я пишу это на C#. Что я сейчас делаю:
Я читаю лог-файлы построчно. Я не загружаю весь файл сразу:
using(StreamReader reader=new StreamReader("C:\ZyWall.log")) { while ((line=reader.ReadLine())!=null) ...... }
Каждую прочитанную строку я разбиваю на части в соответствии с запятыми в ней.
string[] lines = line.Split(new Char[] { ',' }, 10);
Затем я перебираю массив строк, создаю новую строку для предопределенного объекта DataTable и присваиваю значения массива столбцам в строке. Затем я добавляю строку в таблицу данных.
После того, как все строки прочитаны в таблицу данных, я использую OracleBulkCopy для записи данных в нее в физическую таблицу в базе данных с той же структурой. Но дело в том, что я получаю SystemOutOfMemoryException, когда добавляю строки в объект Datatable, это 3-й шаг. Если я закомментирую 3-й шаг, то в диспетчере задач я увижу, что приложение потребляет стабильный объем памяти, который составляет что-то вроде 17000 К, но если я раскомментирую этот шаг, использование памяти будет расти, если не будет достаточно памяти для выделения. Есть ли еще способ использовать BulkCopy для выполнения этого или мне придется делать это вручную? Я использовал BulkCopy, потому что это намного быстрее, чем вставка строк по одной.