Почему 6GB CSV-файл невозможно прочитать целиком в память (64 ГБ) в Numpy

У меня есть CSV-файл, размер которого составляет 6,8 ГБ, и я не могу прочитать его в память в массив массив, хотя у меня есть 64 ГБ ОЗУ

CSV-файл содержит 10 миллионов строк, каждая строка содержит 131 запись (смесь int и float)

Я пытался прочитать его, чтобы пустить массив

import numpy as np
data = np.genfromtxt('./data.csv', delimiter=';')

это не удалось из-за памяти.

когда я читаю только одну строку и получаю размер

data = np.genfromtxt('./data.csv', delimiter=';', max_rows=1)
data.nbytes

Я получаю 1048 байт. Итак, я ожидаю, что 10.000.000 * 1048 = 10,48 ГБ, которые должны храниться в памяти без каких-либо проблем. Почему это не работает?

Наконец, я попытался оптимизировать массив в памяти, определив типы

data = np.genfromtxt('./data.csv', delimiter=';', max_rows=1,
dtype="i1,i1,f4,f4,....,i2,f4,f4,f4")
data.nbytes

поэтому я получаю только 464B на строку, поэтому это будет всего 4,56 ГБ, но все равно невозможно загрузить в память.

Есть ли у вас какие-либо идеи? Мне нужно использовать этот массив в Керасе. Спасибо

1 ответ

Решение

genfromtext это обычный код Python, который преобразует данные в массив только в качестве последнего шага. На этом последнем шаге в ОЗУ должен содержаться гигантский список Python, а также результирующий массив numpy, оба одновременно. Может быть, вы могли бы попробовать numpy.fromfile, или Пандас читатель CSV. Так как вы знаете тип данных на столбец и количество строк, вы также сами предварительно выделяете пустой массив и заполняете его, используя простой цикл for.

Другие вопросы по тегам