У меня есть большой текстовый файл в формате svmlight. Он содержит строки пространства, разделенные парами индексов (int) и значения (float), разделенные точкой с запятой.Быстрое чтение файла svmlight кусками
Пример:
1:2 4:12 5:3 ...
2:34 4:2 12:5 ...
Файл может быть очень большим, и это не представляется возможным прочитать его весь сразу в Numpy массиве.
Как лучше всего прочитать такой файл кусками? Или, может быть, более правильный вопрос заключается в том, как эффективно создать массив numpy в такой ситуации?
На данный момент я использую следующий код. lines
- это список строк, считанных из файла.
x = []
for line in lines:
tmp = re.split('[ :]', line)
out = [0] * len(self.__varnames)
for i in range(0, len(tmp), 2):
out[int(tmp[i])] = float(tmp[i+1])
x.append(out)
x = np.asarray(x)
Это довольно быстро относительно моих других попыток, но я считаю, что это может ускориться.
ПРИМЕЧАНИЕ:
1) load_svmlight_file
из пакета sklearn считывает файл в целом, и он не может прочитать файл без ведущего класса ярлыка, который является необязательным.
2) Я ожидаю найти быстрое решение без зависимостей от внешних библиотек (если таковые существуют). Но, конечно, допускаются numpy
, scipy
.
Спасибо, но это не решит проблему скорости. Ограничение скорости - это создание массива. Я упомянул «прочитать файл кусками», чтобы избежать советов по использованию функций из известных пакетов. – DrDom