Как уже упоминали другие люди, для действительно большого файла лучше повторить.
Однако по разным причинам вы обычно хотите, чтобы все это было в памяти.
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