Библиотека LANCETNIC предназначена для поиска взаимосвязей между признаками и целевой переменной, поддерживая классификацию, регрессию и многозадачное обучение. Разработчик столкнулся с проблемой: при обучении на текстовых датасетах из 25 тыс. строк на ноутбуке с 16 ГБ RAM модель не могла завершить процесс из-за перегрузки оперативной памяти.
Первая причина заключалась в использовании плотных матриц вместо разреженных. При векторизации текста с помощью TfidfVectorizer из sklearn метод.fit_transform() возвращает разреженную матрицу (sparse), но в исходном коде LANCETNIC v4.0.0 разработчик вызывал.toarray(), превращая её в плотную матрицу. Это приводило к хранению всех нулевых значений, что кратно увеличивало объём памяти. На датасете из 25 тыс. строк матрица переставала помещаться в RAM. Исправление состояло в отказе от.toarray() и сохранении разреженного формата на всём конвейере.
| № строки | Текст |
|---|---|
| 1 | Мастер маникюра. Обучим от 7000 в день |
| 2 | Куплю iPhone 15 недорого. Срочно |
| 3 | Бесплатный кредит без справок за 1 час |
| 4 | Мастер маникюра.Пиши в Личные сообщения |
Вторая причина — двойное хранение данных в классе PyTorch Dataset. Конструктор ClassifierDataset сразу конвертировал весь массив X в тензор через torch.tensor(X), создавая полную копию данных в памяти. С учётом того, что X уже был плотной матрицей, итоговый расход памяти утраивался: исходная матрица, плюс плотная копия от TF-IDF, плюс тензор. В исправленной версии конструктор сохраняет ссылку на исходную матрицу, а тензор создаётся на лету в методе __getitem__ для одной строки, что значительно снижает пиковое потребление памяти.
Обе оптимизации не изменили поведение модели, но сделали обучение возможным на стандартном оборудовании. Теперь LANCETNIC может работать с датасетами, содержащими десятки тысяч текстов, без специальных серверов.

