#dataframe #memory #julia #size
#фрейм данных #память #джулия #размер
Вопрос:
Я хотел бы оптимизировать (столбцы в) фрейме данных Julia. Для этого я хотел бы получить размер фрейма данных до и после оптимизации.
Вот пример фрейма данных:
rows, columns = 10_000, 50
df = rand([x for x in "ABCDE"], rows, columns) |> DataFrame
Размер этого df
объекта…
sizeof(df)
Размер равен 24.
Однако, когда я суммирую размеры столбцов, размер отличается…
sum([sizeof(df[x]) for x in names(df)])
Сумма размеров столбцов равна 2000000.
Вот оптимизация…
for i = names(df)
df[i] = CategoricalArray(df[i], ordered=false)
end
Результаты:
sizeof(df)
Размер равен 24.
sum([sizeof(df[x]) for x in names(df)])
Сумма размеров столбцов равна 800.
Есть предложения, как получить точный размер фрейма данных?
Ответ №1:
Вот способ, которым вы можете это сделать:
julia> df = DataFrame(rand([x for x in "ABCDE"], rows, columns), :auto);
julia> Base.summarysize(df)
2007456
julia> Base.summarysize(mapcols(PooledArray, df)) # this will change in the next release of PooledArrays.jl as the default size of refarray element will be UInt32
525656
julia> Base.summarysize(mapcols(categorical, df))
2037256
julia> Base.summarysize(mapcols(x -> categorical(x, compress=true), df))
534856
Обратите внимание, однако, что в данном случае это не так много, так как все ваши столбцы имеют Char
тип элемента. Вы получили бы гораздо больше пользы, если бы имели столбцы, содержащие длинные строки.