Почему размер npy больше чем csv? - PullRequest
0 голосов
/ 21 ноября 2018

Screenshot

Я изменил csv на файл npy.После изменения размер файла csv составляет 5 ГБ, а npy - 13 ГБ.Я думал, что файл npy более эффективен, чем CSV.Я неправильно понимаю это?Почему размер npy больше, чем csv?

Я только что использовал этот код

full = pd.read_csv('data/RGB.csv', header=None).values
np.save('data/RGB.npy', full, allow_pickle=False, fix_imports=False)

и структуру данных примерно так:

R, G, B, is_skin
2, 5, 1, 0
10, 52, 242, 1
52, 240, 42, 0
...(row is 420,711,257)

1 Ответ

0 голосов
/ 21 ноября 2018

В вашем случае элемент представляет собой целое число от 0 до 255 включительно.Это означает, что для сохранения в формате ASCII потребуется не более

  • 3 символа для числа
  • 1 символа для ,
  • 1 символа для пробела

, что дает не более 5 байт (в среднем несколько меньше) на элемент на диске.

Панд читает / интерпретирует это как массив int64 (см. full.dtype) какпо умолчанию, что означает, что для каждого элемента требуется 8 байт, что приводит к увеличению размера npy-файла (большинство из которых - нули!).

Чтобы сохранить целое число от 0 до 255, нам нужен только один байттаким образом, размер npy-файла может быть уменьшен в 8 раз без потери какой-либо информации - просто скажите pandas, что ему нужно интерпретировать данные как 8-разрядные целые числа без знака:

full = pd.read_csv(r'e:\data.csv', dtype=np.uint8).values
# or to get rid of pandas-dependency:
# full = np.genfromtxt(r'e:\data.csv', delimiter=',', dtype=np.uint8, skip_header=1)
np.save(r'e:/RGB.npy', full, allow_pickle=False, fix_imports=False)
# an 8 times smaller npy-file

Большинство изформат времени npy требует меньше места, однако могут быть ситуации, когда формат ASCII приводит к меньшим файлам.

Например, если данные состоят в основном из очень маленьких чисел с одной цифрой и нескольких очень больших чисел, что дляони действительно 8 байтов арнеобходимо:

  • в ASCII-формате вы платите в среднем 2 байта за элемент (не нужно писать пробелы, только 1027 *, так как разделитель достаточно хорош).
  • в формате numpy вы будете платить 8 байт за элемент.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...