Пример минимальной гранулярности блоков
Давайте немного поиграем, чтобы посмотреть, что происходит.
mount
говорит мне, что я нахожусь в разделе ext4, смонтированном в /
.
Я нахожу его размер блока с помощью:
stat -fc %s .
, что дает:
4096
Теперь давайте создадим несколько файлов с размерами 1 4095 4096 4097
:
#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
dd if=/dev/zero of=f bs=1 count="${size}" status=none
echo "size ${size}"
echo "real $(du --block-size=1 f)"
echo "apparent $(du --block-size=1 --apparent-size f)"
echo
done
и результаты:
size 1
real 4096 f
apparent 1 f
size 4095
real 4096 f
apparent 4095 f
size 4096
real 4096 f
apparent 4096 f
size 4097
real 8192 f
apparent 4097 f
Итак, мы видим, что все, что ниже или равно 4096
, на самом деле занимает 4096
байтов.
Затем, как только мы пересекаем 4097
, он поднимается до 8192
, который является 2 * 4096
.
Тогда ясно, что диск всегда хранит данные на границе блока в 4096
байтов.
Что происходит с разреженными файлами?
Я не исследовал, что такое точное представление, но ясно, что --apparent
принимает это во внимание.
Это может привести к тому, что видимые размеры будут больше, чем фактическое использование диска.
Например:
dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f
дает:
8192 f
1073741825 f
Связанные: Как проверить, поддерживается ли разреженный файл
] Что делать, если я хочу хранить кучу небольших файлов?
Некоторые возможности:
Библиография:
Протестировано в Ubuntu 16.04.
Что ж, CGImage
не является CALayer
, поэтому вы, очевидно, оставляете некоторые шаги там, но я предполагаю, что вы знаете, о чем говорите, насколько рисование в CALayer
или еще много чего.
Если ваш вопрос касается создания CGImage
без использования UIImage, вы можете попробовать изучить следующие функции:
Если вы заранее знаете, что это за изображение, просто используйте соответствующий метод. В противном случае вам нужно будет посмотреть подпись файла, чтобы узнать, содержит ли он PNG или JFIF. Конечно, для этого необходимо реализовать CGDataProvider
.
Я предполагаю, что это именно то, что уже делает класс UIImage
. Если вы хотите выжать из этого максимум эффективности, вы можете использовать один из следующих методов в классе UIImage
:
+ (UIImage *)imageWithContentsOfFile:(NSString *)path
+ (UIImage *)imageWithData:(NSData *)data
Единственная разница между этими методами и
+ (UIImage *)imageNamed:(NSString *)name
заключается в том, что imageNamed:
кэширует изображение. Если вы воспользуетесь одним из первых методов, этого не произойдет.