Как избежать повторной загрузки большого файла в скрипт Python?
Я написал скрипт на python, чтобы взять большой файл (матрица ~50k строк X ~500 столбцов) и использовать его в качестве набора данных для обучения модели случайного леса.
Мой сценарий имеет две функции: одну для загрузки набора данных, а другую для обучения модели случайного леса с использованием указанных данных. Они оба работают нормально, но загрузка файла занимает ~45 секунд, и каждый раз, когда я хочу обучить слегка различную модель (тестирование множества моделей на одном наборе данных), это сложно сделать. Вот код загрузки файла:
def load_train_data(train_file):
# Read in training file
train_f = io.open(train_file)
train_id_list = []
train_val_list = []
for line in train_f:
list_line = line.strip().split("\t")
if list_line[0] != "Domain":
train_identifier = list_line[9]
train_values = list_line[12:]
train_id_list.append(train_identifier)
train_val_float = [float(x) for x in train_values]
train_val_list.append(train_val_float)
train_f.close()
train_val_array = np.asarray(train_val_list)
return(train_id_list,train_val_array)
Это возвращает пустой массив с col. 9 в качестве метки и cols. 12-конец в качестве метаданных для обучения случайного леса.
Я собираюсь обучить много разных форм моей модели одним и тем же данным, поэтому я просто хочу загрузить файл один раз и сделать его доступным для использования в моей функции произвольного леса. Я хочу, чтобы файл был объектом, я думаю (я довольно новичок в python).
4 ответа
Если я вас правильно понимаю, набор данных не меняется, но параметры модели меняются, и вы меняете параметры после каждого запуска.
Я бы поместил скрипт загрузки файла в один файл и запустил его в интерпретаторе python. Затем файл будет загружен и сохранен в памяти с любой переменной, которую вы используете.
Затем вы можете импортировать другой файл с кодом модели и запустить его с данными обучения в качестве аргумента.
Если все изменения вашей модели могут быть определены как параметры в вызове функции, все, что вам нужно, это импортировать вашу модель, а затем вызвать функцию обучения с различными настройками параметров.
Если вам нужно изменить код модели между запусками, сохраните с новым именем файла и импортируйте его, запустите снова и отправьте исходные данные этому.
Если вы не хотите сохранять каждую модификацию модели с новым именем файла, вы можете использовать функцию перезагрузки в зависимости от версии Python, но это не рекомендуется (см. Правильный способ перезагрузки модуля Python из консоли).
Простейшим способом было бы кешировать результаты, например так:
_train_data_cache = {}
def load_cached_train_data(train_file):
if train_file not in _train_data_cache:
_train_data_cache[train_file] = load_train_data(train_file)
return _train_data_cache[train_file]
Загрузите ваши данные в ipython.
my_data = open("data.txt")
Напишите свои коды в скрипте Python, например, example.py, который использует эти данные. В верхней части скрипта example.py добавьте эти строки:
import sys
args = sys.argv
data = args[1]
...
Теперь запустите скрипт python в ipython:
%run example.py $mydata
Теперь при запуске скрипта Python вам не нужно загружать данные несколько раз.
Попробуйте узнать о сериализации данных Python. В основном вы будете хранить большой файл как сериализованный двоичный объект для Python, используя функцию маршала python. Это резко ускорит IO файла. Смотрите эти тесты для оценки производительности. Однако, если все эти модели случайных лесов обучаются одновременно, вы можете просто обучить их по набору данных, который у вас уже есть в памяти, а затем выпустить данные поезда после завершения.