我正在尝试sort
在 Linux 中创建一个巨大的列表(130 GB)。部分是这样的:
@K00188:14:H2LMFBBXX:6:1101:27440:1668 1:N:0:0_I_CGATGT
@K00188:14:H2LMFBBXX:6:1101:30262:1668 1:N:0:0_I_CGATGT
@K00188:14:H2LMFBBXX:6:1101:6501:1686 1:N:0:0_I_CGATGT
@K00188:14:H2LMFBBXX:6:1101:18133:1686 1:N:0:0_I_CGATGT
@K00188:14:H2LMFBBXX:6:1101:21827:1686 1:N:0:0_I_CGATGT
问题是 期间 RAM 不足sort
。
以前的问题有一些解决方案(例如sort --parallel
,python 脚本等),但它们在我手上不起作用。
我想坚持,sort
但在使用该选项时出现以下错误消息--parallel
sort: unrecognized option '--parallel=2'
Try `sort --help' for more information.
如果有一些为大列表排序而编写的Python脚本,我想尝试一下。
你有什么建议吗?
答案1
sort
(除了一些精简的实现,例如busybox
)不受内存限制,因为它仅使用有限的数量,并在达到该限制时诉诸临时文件。
更有可能的是,您的磁盘空间不足。在正在使用的临时区域中,您将需要大约 130GB 的可用磁盘空间sort
(除了用于存储结果的磁盘空间,除非您使用 写入文件本身sort -o mybigfile mybigfile
)。
如果 的文件系统中没有足够的空间/tmp
,请设置$TMPDIR
为具有更多可用磁盘空间的位置(另请参阅-T
一些sort
实现的选项):
TMPDIR=~/tmp sort my-big-file > sorted
为了减少所需的临时磁盘空间量,在某些sort
实现中,您还可以告诉它压缩临时文件。如果您选择一个易于使用 CPU 的压缩器(例如lzop
在旋转磁盘上有文件系统),甚至可能会提高性能。
TMPDIR=~/tmp sort --compress-program=lzop my-big-file > sorted
答案2
我正在尝试对一个巨大的列表(130 GB)进行排序。
您想要逐行对一个巨大的文本文件进行排序。
排序:无法识别的选项“--parallel=2”
这是有记录的作为最近的 GNU coreutils 接受的选项。所以你很不幸没有 GNU corutils,sort
而是有其他的。所以我建议编译并安装最近的 GNU 核心工具,例如来自其的 coreutils-8.27来源(2017 年夏季)。您可以使用--program-suffix=-my
其configure
脚本进行sort-my
安装(以避免弄乱提供的系统sort
)。
(即使没有root权限,您也可以configure
使用例如--prefix=$HOME/pub
then make install
;然后您可能想要添加$HOME/pub/bin/
到您的小路....)
如果不可能,您可以使用分裂,然后对每个较小的块进行排序,然后合并它们(使用sort --merge
)。
另一种可能性是编写一些小的 Python 脚本来解析这个大文件并将其放入某个文件中。sqlite数据库。
我强烈建议获取并使用最新的 GNU核心工具(任何其他方法都会花费您更多的时间)。这是最实用的方法。您的文件系统上可能需要足够的额外可用空间(可能是 150Gb)来运行排序。
如果您从未从源代码编译过任何 GNU 实用程序,我建议您执行以下步骤:
例如,使用 或您的浏览器获取 coreutils 源 tar 球
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.27.tar.xz
。tar xvf coreutils-8.27.tar.xz
使用(使用最新的 GNU tar)提取它;否则使用解压xz -d coreutils-8.27.tar.xz
然后使用解压tar xvf coreutils-8.27.tar
创建一个用于安装 GNU 实用程序的目录
mkdir $HOME/gnu/
进入 coreutils 源目录
cd coreutils-8.27
编译前配置:
./configure --prefix=$HOME/gnu/ --program-suffix=-my
如果您收到一些错误消息,请尝试纠正您的系统(例如,由于缺少 C 编译器等实用程序)和/或寻求帮助。阅读自动配置和配置脚本了解选项。
建造它
make
安装它(如果构建顺利)
make install
(您不需要任何 root 权限即可运行上述所有内容)
- 然后用来
$HOME/gnu/bin/sort-my
进行排序(您可能会考虑添加$HOME/gnu/bin/
到您的小路能够简单地输入sort-my
)