Как сжать CSV GZIP меньше, чем 100 МБ? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть df, который я написал как gzip, используя следующие строки кода:

df.to_csv('filepath/file.csv.gz',compression='gzip',sep=',',index=False)

В приведенной выше строке выводится файл gzip размером 117 МБ.Как я могу получить размер файла еще меньше с функциональностью gzip в to_csv?

Редактировать:

использовал эту строку кода, чтобы определить, сколько памяти я использую:

df.info(memory_usage='deep')

Получил

memory usage: 9.9 GB

1 Ответ

0 голосов
/ 11 октября 2018

Это примерно столько, сколько я мог бы сделать мой ответ.Важно понимать потребление памяти датафреймами и то, какие dtypes потребляют больше памяти.Я бы серьезно порекомендовал эту страницу для получения дополнительной информации о памяти.

Предположим, у меня есть небольшой кадр данных, который выглядит как эти числа:

   Number Number2 Number3
0       1     "1"     One
1       2     "2"     Two
2       3     "3"   Three
3       4     "4"    Four

, и я хотелпроверьте dtype чисел:

print(df.dtypes)
>>> df.dtypes
Number      int64
Number2    object
Number3    object
dtype: object

Мы можем видеть, что столбец 2 рассматривается как объект, даже если все в этом столбце является целым числом, заключенным в кавычки.В некоторых случаях вы можете рассматривать ваш int как строку (например, если вы пытаетесь выполнить какой-либо тип сопоставления строк), тогда вы не хотите преобразовывать тип из объекта в int.Но, скажем, в этом случае это не имеет значения, и вы в порядке с преобразованием.Давайте проверим использование памяти с помощью этой небольшой проверки памяти объектов pandas:

def mem_usage(pandas_obj):
    if isinstance(pandas_obj,pd.DataFrame):
        usage_b = pandas_obj.memory_usage(deep=True).sum()
    else: # we assume if not a df it's a serie
        usage_b = pandas_obj.memory(deep=True)
    return "{:03.2f} B".format(usage_b)
print(mem_usage(df))
### >>> mem_usage(df)
### '459.00 B'

Допустим, я могу позволить изменить тип dtype с объекта на int (сначала нужно удалить кавычки):

df['Number2'] = df.Number2.str.replace('"', '')
df['Number2'] = df.Number2.astype(int)
print(df.dtypes)
### >>> df.dtypes
### Number      int64
### Number2     int32
### Number3    object
### dtype: object

print(mem_usage(df))
### >>> mem_usage(df)
### '299.00 B'
df.to_csv('./Desktop/numbers_fixed.csv', index=False)

Вот так, изменив dtype, мы перешли с 459B памяти на 299B.Подумайте, если бы это был большой набор данных, который уменьшил бы объем памяти в 1,5 раза, просто изменив dtype.Я не говорю, что делать это произвольно, но если вы обрабатываете внешние данные или просто неправильно анализируете свой df, это может произойти.Целые числа или числа с плавающей запятой могут быть считаны как объекты, и вы увидите значительное сокращение памяти, просто изменив тип данных.Чтобы показать, что это относится к созданию файла, смотрите изображение:

Memory Reduction

...