是否可以在不使用 zram 或 zswap 的情况下获得压缩交换文件?
实际上,我已经使用以下命令成功通过 sftp 使用 sshfs 安装了交换文件,并且我想对其使用压缩:
mkdir /tmp/remoter
sshfs anonymous@192.168.42.129:/sdcard/r /tmp/remoter -C -p 2222 -o allow_root -o no_readahead -o cache=no -o uid=0 -o gid=0
dd if=/dev/zero of=/tmp/remoter/swapfile bs=50M count=1
sudo losetup /dev/loop0 /tmp/remoter/swapfile
sudo mkswap /dev/loop0
sudo swapon /dev/loop0
Run Code Online (Sandbox Code Playgroud)
本地和远程主机均缺少 zram 支持。
我设置了 zram 并在我的 Linux 机器中进行了广泛的测试,以衡量它对我的场景是否真的有帮助。但是,我很困惑 zram似乎耗尽了整个未压缩数据大小的内存。当我输入“zramctl”时,我看到:
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 2G 853,6M 355,1M 367,1M 4 [SWAP]
Run Code Online (Sandbox Code Playgroud)
根据 zramctl 的帮助命令,DATA
是未压缩的大小和TOTAL
包含元数据的压缩内存。然而,当我输入 时swapon -s
,我看到以下输出:
Filename Type size used Priority
/dev/sda2 partition 1463292 0 4
/dev/zram0 partition 2024224 906240 5
Run Code Online (Sandbox Code Playgroud)
906240
是以千字节为单位的已用内存,可转换为DATA
zramctl 的 853,6M 值。这给人留下的印象是,压缩的 zram 设备需要的内存多于它节省的内存。一旦DATA
满了,它实际上开始交换到磁盘驱动器,因此它肯定已满。
为什么zram看似占用了原始数据大小的内存?COMPR
为什么它不是or的大小TOTAL
?网上好像还没有这方面的资料,因为我还没有找到这方面的任何信息。谢谢你!
我一直在玩 Btrfs 和压缩,但我一直无法让 Btrfs 使用我所有的 CPU 内核进行压缩。
内核压缩进程最多可处理 64 个可用内核中的 8 个内核(全部运行 >90%) - 无论我是并行写入 1、10 还是 64 个文件。
top - 23:34:36 up 1:30, 4 users, load average: 12.96, 13.03, 12.12
Tasks: 891 total, 20 running, 871 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 19.6 sy, 0.0 ni, 80.2 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st
GiB Mem : 503.9 total, 1.2 free, 16.6 used, 486.1 buff/cache
GiB Swap: 296.5 total, 263.5 free, 33.0 used. 465.3 avail …
Run Code Online (Sandbox Code Playgroud) 我有一个 20GB RAR 文件需要在 Debian Linux Google Cloud VM 上使用密码进行解压。
我第一次尝试sudo apt-get install unrar
,但给出了以下输出:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package unrar is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'unrar' has no installation candidate
Run Code Online (Sandbox Code Playgroud)
我发现这很可能是因为我没有激活多元宇宙,所以我尝试了一下sudo add-apt-repository multiverse
。这不起作用:
Error: 'multiverse' invalid
Run Code Online (Sandbox Code Playgroud)
我最终发现一个帖子说可以安装“unrar free”。我安装了它,然后运行unrar-free -x -p Filename.rar
。它当前正在检查存档中的每个文件并给出以下输出:
Extracting …
Run Code Online (Sandbox Code Playgroud) 的ENT程序可以在一个文件中运行以得到输出如下面的:
熵 = 每字节 4.731183 位。
最佳压缩将把这个 15731 字节文件的大小减少 40%。
15731 个样本的卡方分布为 235086.62,随机超过该值的次数少于 0.01%。
数据字节的算术平均值为 87.3796(127.5 = 随机)。Pi 的蒙特卡罗值为 4.000000000(误差 27.32%)。序列相关系数为 0.140065(完全不相关 = 0.0)。
程序如何确定“最佳压缩”可以实现什么?
我注意到这个估计通常甚至被 gzip 击败。
我需要在资源有限且对延迟非常敏感的环境中尽快下载并解压缩文件(具有 1 个 cpu、2 个内核、128MB RAM 的虚拟机)
当然,我尝试将下载过程通过管道传输到解压缩过程,并假设我可以在下载的同时解压缩。我知道管道被最慢的进程阻塞。为了克服这个问题,我在下载和解压缩过程之间使用了一个缓冲区。
我的 shell 脚本看起来像这样:
curl -s $CACHE_URL | buffer -S 100M | lz4 -d > /tmp/myfile
Run Code Online (Sandbox Code Playgroud)
如果我首先下载压缩文件,然后在不使用管道的情况下解压缩,则下载大约需要 250 毫秒,如果按顺序执行,解压缩大约需要 250 毫秒。
因此,我的假设是管道方法将花费大约 250-275 毫秒,因为中间没有额外的磁盘读取,并且下载不像解压缩那样受 CPU 限制,因此不会影响那么多。
但事实并非如此。正如我的日志所示,它的速度稍快一些:
Start download
35211K, 81131K/s
Download & decompressed done in 447ms
Starting individual download & decompress
Download done in 234ms
Decompressed : 61 MiB
/tmp/myfile : decoded 75691880 bytes
Decompress done in 230ms
Run Code Online (Sandbox Code Playgroud)
我这里是不是想错了?还有其他方法可以加快这个速度吗?
我有一些完整的旧备份,比如二进制数据库转储。显然,它们没有太大区别,因此进行完整备份在这里并不是最明智的想法。现在,我正在寻找一种能够利用大多数文件具有相似内容这一事实的压缩程序。
我刚刚安装了 xsane,我已经用我的 Epson Perfection V30 成功测试了它。使用这些设置进行扫描时
输出文件非常大。有没有办法减小尺寸,最好是通过 xsane 中的内置设置/选项?
是否有一种快速而肮脏的方法来估计gzip
文件的可压缩性而不必完全压缩它gzip
?
我可以,在bash
,做
bc <<<"scale=2;$(gzip -c file | wc -c)/$(wc -c <file)"
Run Code Online (Sandbox Code Playgroud)
这为我提供了压缩系数,而无需将gz
文件写入磁盘;这样我就可以避免用它的gz
版本替换磁盘上的文件,如果由此产生的磁盘空间节省不能证明这个问题是合理的。但是通过这种方法,文件确实完全通过了gzip
;只是输出通过管道传输到wc
而不是写入磁盘。
有没有办法在不gzip
处理所有内容的情况下对文件进行粗略的压缩性估计?
我想在我的系统上使用 LZMA 压缩的内核模块。不幸的是,Canoncial 在内核和用户空间工具中都禁用了该功能。这是我到目前为止所做的:
使用以下命令编译并安装当前的14.04.05-LTS 内核(v4.4.19):
CONFIG_MODULE_COMPRESS=y
CONFIG_MODULE_COMPRESS_XZ=y
Run Code Online (Sandbox Code Playgroud)
安装后,我现在可以.ko.xz
在/lib/modules/4.4.19-37.56+/kernel/
.
将kmod_22
包从 Xenial (16.04) 向后移植到配置了该--with-xz
选项的Trusty (14.04) 。这似乎也有效。
运行update-initrams -u -k 4.4.19-37.56+
。
到目前为止有效的方法:
对未压缩模块的任意操作(如 DKMS 构建的模块):
$ modinfo nvidia_370
filename: /lib/modules/4.4.19-37.56+/updates/dkms/nvidia_370.ko
[…]
Run Code Online (Sandbox Code Playgroud)按完整路径显示压缩模块:
modinfo /lib/modules/4.4.19-37.56+/kernel/fs/jfs/jfs.ko.xz
Run Code Online (Sandbox Code Playgroud)通过完整路径加载没有(缺少)依赖项的压缩模块:
insmod /lib/modules/4.4.19-37.56+/kernel/fs/jfs/jfs.ko.xz
Run Code Online (Sandbox Code Playgroud)卸载这样的模块:
rmmod jfs
Run Code Online (Sandbox Code Playgroud)什么不起作用:
卸载与modprobe -r
。
任何其他只有包名但没有路径的操作,例如:
# insmod jfs
insmod: ERROR: could not load module jfs: No such file or directory
# modprobe jfs
modprobe: FATAL: Module jfs not found …
Run Code Online (Sandbox Code Playgroud)