Проблема вашего примера.
Пробуя ваш код в небольшом масштабе, я заметил, что даже если вы установите dtype=int
, вы фактически получите dtype=object
в результирующем кадре данных.
header = ['a','b','c']
rows = 11
df = pd.DataFrame(columns=header, index=range(rows), dtype=int)
df.dtypes
a object
b object
c object
dtype: object
Это связано с тем, что даже если вы даете функции pd.read_csv
инструкцию о том, что столбцы являются dtype=int
, она не может переопределить dtypes, которые в конечном итоге определяются данными в столбце.
Это связано с тем, что панды тесно связаны с numpy и numpy dtypes.
Проблема в том, что в созданном вами кадре данных нет данных, поэтому numpy по умолчанию использует данные как np.NaN
, что не помещается в целое число.
Это означает, что numpy запутывается и по умолчанию возвращается к dtype, равному object
.
Проблема объекта dtype.
Если для dtype установлено значение object
, это означает большие накладные расходы на потребление памяти и время выделения по сравнению с тем, если бы вы установили dtype как целое число или число с плавающей запятой.
Обходной путь для вашего примера.
df = pd.DataFrame(columns=header, index=range(rows), dtype=float)
Это прекрасно работает, так как np.NaN
может жить в поплавке. Это производит
a float64
b float64
c float64
dtype: object
И должно занимать меньше памяти.
Подробнее о том, как относиться к dtypes
См. этот связанный пост для получения подробной информации о dtype: Pandas read_csv low_memory и параметры dtype< /а>
person
firelynx
schedule
09.02.2015
ms.txt
. Вы вызываете егоreadline()
, что означает, что это многострочный текстовый файл, но затем выsplit
его. Можете ли вы опубликовать, может быть, первые 10 строк, чтобы быть уверенным? - person NullDev   schedule 29.01.2015readline
, а неreadlines
. Виноват. Первый, конечно, читает только одну строку. Случайно, какой размер файлаms.txt
? - person NullDev   schedule 29.01.2015np.zeros((1100, 3000000)).nbytes / 1e9
, я получаю26.4
. Тип dtype —float64
. - person ely   schedule 29.01.2015read_csv
, что все будет целым числом. - person Paul H   schedule 29.01.2015with open("ms.txt") as f: header = [x.split("\t") for x in f.readline()]
? - person NullDev   schedule 29.01.2015pandas
тест производительности раньше с использованием 50 ГБ данных, и я не помню, чтобы он использовал 170 ГБ ОЗУ. - person NullDev   schedule 29.01.2015np.zeros((1100, 3000000), dtype=object)
, он просто зависнет, но я предполагаю, что потребление памяти будет намного выше. Возможно,read_csv
делает это и делает несколько копий некоторых вещей, пытаясь распознать типы данных во время чтения? - person ely   schedule 29.01.2015read_csv
, похоже, что в общем случае он достигает дна сpandas.io.parsers.PythonParser.read
, который, кажется, делает копии во время преобразования даты, и в_convert_data
, который вызывает_convert_to_ndarrays
, который вызывает_convert_types
, который затем имеет дополнительные вызовы некоторых функций, таких какmaybe_convert_numeric
и т. д. , В любом месте этого следа кода вы можете получить увеличение из-заobject
типа и из-за неэффективного копирования. - person ely   schedule 29.01.2015