Ответ 1
Как отмечали другие люди, для действительно большого файла вам лучше выполнять итерацию.
Однако, вы часто хотите, чтобы все было в памяти по разным причинам.
genfromtxt
намного менее эффективен, чем loadtxt
(хотя он обрабатывает отсутствующие данные, тогда как loadtxt
более "тощий и средний", поэтому две функции сосуществуют).
Если ваши данные очень регулярные (например, просто простые строки с одинаковым типом), вы также можете улучшить либо с помощью numpy.fromiter
.
Если у вас достаточно бара, подумайте об использовании np.loadtxt('yourfile.txt', delimiter=',')
(вам также может потребоваться указать skiprows
, если у вас есть заголовок в файле.)
В качестве быстрого сравнения загружаемый ~ 500 МБ текстовый файл с loadtxt
использует ~ 900 МБ оперативной памяти при максимальном использовании, а при загрузке того же файла с genfromtxt
используется ~ 2,5 ГБ.
Loadtxt
Genfromtxt
В качестве альтернативы рассмотрите следующее. Он будет работать только для очень простых, регулярных данных, но это довольно быстро. (loadtxt
и genfromtxt
делать много угадывания и проверки ошибок. Если ваши данные очень простые и регулярные, вы можете улучшить их значительно.)
import numpy as np
def generate_text_file(length=1e6, ncols=20):
data = np.random.random((length, ncols))
np.savetxt('large_text_file.csv', data, delimiter=',')
def iter_loadtxt(filename, delimiter=',', skiprows=0, dtype=float):
def iter_func():
with open(filename, 'r') as infile:
for _ in range(skiprows):
next(infile)
for line in infile:
line = line.rstrip().split(delimiter)
for item in line:
yield dtype(item)
iter_loadtxt.rowlength = len(line)
data = np.fromiter(iter_func(), dtype=dtype)
data = data.reshape((-1, iter_loadtxt.rowlength))
return data
#generate_text_file()
data = iter_loadtxt('large_text_file.csv')
Fromiter