【发布时间】:2023-03-14 02:00:01
【问题描述】:
我有包含许多字符串的文本文件,每行一个,需要排序。
我正在尝试使用sort 命令,但是它只能按字母或数字顺序排序,我需要更具体的东西。
是否可以使用外部程序来确定项目的顺序,例如sort --input=text.txt --evaluate=/bin/program?
【问题讨论】:
标签: sorting
我有包含许多字符串的文本文件,每行一个,需要排序。
我正在尝试使用sort 命令,但是它只能按字母或数字顺序排序,我需要更具体的东西。
是否可以使用外部程序来确定项目的顺序,例如sort --input=text.txt --evaluate=/bin/program?
【问题讨论】:
标签: sorting
sort 或我知道的任何排序软件都不支持它。
这实际上不可行,因为它太耗费资源而无法启动进程。根据需要启动数千个进程来比较数千对字符串,几乎会在短时间内冻结系统。
考虑一个小文本:
dog
cat
duck
mouse
...
排序需要比较键对。比如dog vs cat,然后dog vs duck,等等...来确定项目的相对顺序。根据算法和项目是否已经订购,需要在 N 和 N*N 之间进行比较。
在提供内置排序功能的编程语言中,开发人员必须提供一个比较器函数,如int comp(string first, string second),如果两个字符串分别按顺序返回-1、0 或+1,则等于或以相反的顺序。 (等号对于重复和稳定排序非常重要)。请参阅 Python sorted(..., key) 或 C++ std::sort(..., comp)。
理论上可以根据外部二进制/bin/compararator firstitem seconditem 和退出代码进行比较。 (忽略参数仅限于 ASCII 字符子集中的短字符串的问题)。
它实际上太慢了,并且会在排序开始的那一刻冻结系统。它必须为(最多)每对字符串启动一个子进程。对于操作系统而言,启动进程是一项非常缓慢且非常密集的任务。
一个进程需要大约 10 到 100 毫秒来初始化,即使在最现代的最快 CPU 上也是如此。 对数千个字符串的小排序可能需要整整几分钟(数百万次比较),而正常的内存排序可以在几毫秒内完成。
使用外部二进制文件进行比较是非常缓慢和低效的,尝试这样做没有任何意义。但它也会变得更糟,请耐心等待。
进程创建是一项非常密集的任务,涉及操作系统和内核的深刻变化。系统将停止运行,几乎没有响应,而进程被无休止地创建。在这方面,它与只烧 CPU(例如使用while(1))不同,这无疑是“坏的” " 但不会显着影响其他正在运行的任务。
如果开发人员必须实现工作池,创建一百个进程(或一千个线程)来完成一些工作。他们可能已经注意到,在创建池时,他们的桌面在几秒钟内冻结得非常糟糕。事实上,这太糟糕了,通常的做法是强睡眠以减轻系统负载for(n=0, n<100, n++) { startworker(); sleep(100ms); };。 (不用说,如果排序软件仅限于每秒进行几次比较,那么排序软件将永远无法完成)。
供历史参考。在互联网初期运行 Web 应用程序的一种常见方式是CGI。一个简单的接口,在每个传入的 HTTP 请求上启动一个进程,使用标准输入/输出和环境变量来传递请求信息。它遇到了上述所有问题(速度慢、效率低和相关的 DDoS 问题),很快就不再使用了。不能很好地超过每秒几个请求。
【讨论】: