Как эффективно обработать тысячи файлов без утечки RAM?

lextorg

Client
Регистрация
25.05.2014
Сообщения
60
Благодарностей
10
Баллы
8
Каждый день появляются сотни CSV лог-файлов, которые требуют обработки.
Формат записи строки такой:
log1;;log2;log3;;;log4;;log5;log6

Строк в файле может быть от 10 до 20кк.
Мне нужно взять из строки 4-е вхождение между ; и сохранить его в файл\список.

Сейчас работает так - привязывается таблица, с помощью C# берется 4-я колонка с помощью метода source.GetCell("D",i); и результат сохраняется в список. В зависимости от объёма фала примерно на 50-м файле память начинает утекать, т.к. из RAM не выгружаются привязанные таблицы и в течение 10-20 минут вся досутпная RAM занимается ZP. Дальше приходится мониторить и ребутить вручную ZP, что вообще не айс.

Помогите найти максимально эффективное решение по обработке множества файлов с подобной задачей.
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
271
Баллы
63
Можно работать напрямую с файлами, брать содержимое во временный список, обрабатывать и складывать нужное в постоянный список. А чтобы память не забивалась, нужно разными потоками это делать. А как, это уже вопрос фантазии, например, можно брать файл в работу, переносить его в другую папку, чтобы другой поток не взял его.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
зависимости от объёма фала примерно на 50-м файле память начинает утекать, т.к. из RAM не выгружаются привязанные таблицы
Как понимаю шаблон не завершает работу, пока не пройдет все файлы? Значит нужно логику менять, обработал, сохранил нужное, завершил выполнение. Взял следующий.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
правильно выше написали. надо не привязывать файл, а брать напрямую из файла и не забывать закрывать файловое соединение. тогда и не будет ничего утекать.
 

lextorg

Client
Регистрация
25.05.2014
Сообщения
60
Благодарностей
10
Баллы
8
Как понимаю шаблон не завершает работу, пока не пройдет все файлы? Значит нужно логику менять, обработал, сохранил нужное, завершил выполнение. Взял следующий.
Опытным путём определил, что в цикле до 100 файлов RAM забивается на 40% медленней, нежели использовать предел цикла в 500 или 20 файлов. Если ставить на обработку 1 файла за 1 проход без цикла, время обработки 100 файлов увеличивается в десятки раз. Условно говоря, 1 файл обрабатывается в цикле со 100 итерациями за 1 секунду, а если запускать в обработку 1 файл в 1 поток с окончанием работы проекта, то 100 фалов будут обрабатываться минут 15. Это из-за времени на старт-стоп поднятия задания в ZP. (Само собой, что не используются инстансы)
 

lextorg

Client
Регистрация
25.05.2014
Сообщения
60
Благодарностей
10
Баллы
8
правильно выше написали. надо не привязывать файл, а брать напрямую из файла и не забывать закрывать файловое соединение. тогда и не будет ничего утекать.
Какими методами это делается, подскажете?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
Какими методами это делается, подскажете?
C#:
    List<string> list_ = new List<string>();  // временный список
    FileStream fstream = new FileStream(file_, FileMode.OpenOrCreate);    // поток файловый
    StreamReader sr = new StreamReader(fstream);                                            // задали поток на чтение
    while ((line111 = sr.ReadLine()) != null)     {  
        // работа со строкой из файла
        // list_.Add(line111);
    }                  
    fstream.Close();                                                                            // закрыли файл
 
  • Спасибо
Реакции: lextorg

lextorg

Client
Регистрация
25.05.2014
Сообщения
60
Благодарностей
10
Баллы
8
C#:
    List<string> list_ = new List<string>();  // временный список
    FileStream fstream = new FileStream(file_, FileMode.OpenOrCreate);    // поток файловый
    StreamReader sr = new StreamReader(fstream);                                            // задали поток на чтение
    while ((line111 = sr.ReadLine()) != null)     { 
        // работа со строкой из файла
        // list_.Add(line111);
    }                 
    fstream.Close();                                                                            // закрыли файл
Логику понял. Спасибо. Остаётся один вопрос - как с помощью C# взять 4-е вхождение по регулярке из стороки, когда разделитель ; (точка с запятой)?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
Логику понял. Спасибо. Остаётся один вопрос - как с помощью C# взять 4-е вхождение по регулярке из стороки, когда разделитель ; (точка с запятой)?
сплит по ; сделай и забирай 4 строку или 3-ю я не помню там откуда отсчет идет :-)
 

seoshnek

Client
Регистрация
08.03.2010
Сообщения
101
Благодарностей
47
Баллы
28
Можно при помощи стороннего софта - Textpipe pro -
Copy fields:Comma-delimited field 1 .. field 20 copy to 1

Запускать типа батник ,

Утечек не будет, обрабатывает десятки гигабайт.
 
  • Спасибо
Реакции: lextorg

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
как с помощью C# взять 4-е вхождение по регулярке из стороки, когда разделитель ; (точка с запятой)?
C#:
string log = "log1;;log2;log3;;;log4;;log5;log6";

string[] array = log.Split(new[] {";"}, StringSplitOptions.None);
string result = array [3]; // Отсчитываешь от нуля
 
  • Спасибо
Реакции: lextorg

lextorg

Client
Регистрация
25.05.2014
Сообщения
60
Благодарностей
10
Баллы
8
Можно при помощи стороннего софта - Textpipe pro -
Copy fields:Comma-delimited field 1 .. field 20 copy to 1

Запускать типа батник ,

Утечек не будет, обрабатывает десятки гигабайт.
Спасибо. Всё получилось в лучшем виде. Крайне функциональная софтина с отличной скоростью обработки по всем нужным макросам. Этим и буду дальше пользоваться.
750ГБ обработала за 4час 51 мин, 21сек без изнасилования диска. ZP в 100 потоков делала тоже самое за ~13.5 часов.
 
  • Спасибо
Реакции: seoshnek

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)