在Windows上对一个非常大的(800GB)文本文件进行排序 sorting
23
另一个选择是将文件加载到数据库中,比如MySQL和MySQL Workbench。 数据库非常适合处理大文件。 如果输入文件只包含由换行符分隔的单词,那么这应该不难。 在安装了数据库和MySQL Workbench之后,您需要做以下操作。 首先,创建模式(假设单词不会超过255个字符,但您可以通过增加参数值来修改此限制)。 第一列“idwords”是主键。 CREATE SCHEMA `tmp` ; CREATE TABLE `tmp`.`words` ( `idwords` INT NOT NULL AUTO_INCREMENT, `mywords` VARCHAR(255) NULL, PRIMARY KEY (`idwords`)); 其次,导入数据。
例如,这将把所有的单词导入到表中;这个步骤可能需要一些时间来完成。我的建议是先用一个较小的文件进行测试,一旦确定格式与较大的文件相同(清空表格...即清除并加载完整的数据集),再进行操作。
LOAD DATA LOCAL INFILE "C:\words.txt" INTO TABLE tmp.words LINES TERMINATED BY 'rn' (mywords); 这个链接可能有助于正确加载数据的格式。 https://dev.mysql.com/doc/refman/5.7/en/load-data.html 例如,如果你需要跳过第一行,你可以按照以下步骤操作。
LOAD DATA LOCAL INFILE "H:\words.txt" INTO TABLE tmp.words -- FIELDS TERMINATED BY ',' LINES TERMINATED BY 'rn' IGNORE 1 LINES (mywords);
最后,保存排序后的文件。这可能需要一些时间,也取决于您的计算机。
SELECT tmp.words.mywords FROM tmp.words order by tmp.words.mywords asc INTO OUTFILE 'C:\sorted_words.csv'; 你也可以随意搜索数据,按照你喜欢的方式。
例如,这将按升序给出前50个单词(从零位置或第一个单词开始)。
SELECT tmp.words.mywords FROM tmp.words order by tmp.words.mywords asc LIMIT 0, 50 ;
- Peter H
4
回答链接
7
排序
有许多算法可用于对有序和无序文件进行排序[1]。
由于所有这些算法已经实现,选择一个经过测试的程序。
在coreutils中(来自Linux,但也适用于Windows[2]),存在一个能够在多核处理器下并行运行的sort命令:通常已经足够了。
如果您的文件非常大,您可以使用拆分处理(split -l)将文件分成一些块,可能使用并行选项(--parallel),并使用-m选项将结果有序块进行排序(合并排序)。
其中一种方法是在此处解释的(拆分文件,对单个块排序,合并有序块,删除临时文件)。
注意:
在Windows 10中存在所谓的Windows子系统,其中所有的Linux示例都会显得更加自然。 使用不同算法进行排序的执行时间会随着要排序的数据条目数量的增加而变化(O(nm),O(nlogn)...)。 算法的效率取决于原始文件中已经存在的顺序。
(例如,对于一个已经排序好的文件,冒泡排序是最快的算法 -- 恰好是N个元素 --,但在其他情况下它并不高效)。 - Hastur
回答链接
2
为了给Peter H提供一个替代方案,有一个叫做q的程序可以允许对文本文件执行SQL风格的命令。 下面这个命令可以实现相同的功能(在与文件相同的目录下从命令提示符运行),而无需安装SQL Workbench或创建表格。 q "select * from words.txt order by c1" 是指第一列的简写。
您可以使用以下方法排除重复单词
q "select distinct c1 from words.txt order by c1" 将输出发送到另一个文件中。
q "select distinct c1 from words.txt order by c1" > sorted.txt
- Brian
3
回答链接
2
如果每行的单词都来自有限的词汇(比如英语),那么您可以使用TreeMap和记录计数的方法,在O(n + m log m)的时间内对列表进行排序(其中m是唯一值的数量)。 否则,您可以使用Java库big-sorter。它将输入分割成已排序的中间文件,并高效地合并它们(总体上是O(nlogn))。要对您的文件进行排序,可以按以下方式操作: Sorter.serializerTextUtf8() .input(inputFile) .output(outputFile) .loggerStdOut() // display some progress .sort(); 我用随机生成的16个字符的单词创建了一个1.7GB(100万行)的文件,并在142秒内按照上述方式进行了排序。根据我使用的方法的O(n log n)计算复杂度,我估计在我的i5 2.3GHz笔记本电脑上,使用单线程对800GB的16个字符的单词进行排序大约需要24小时,而且我还使用了SSD硬盘。
- Dave Moten
回答链接
相关知识
排序+三消,下载500万??益智手游《Goods Sorting》商品分类中
获取Windows 10上文件资源管理器的帮助
在 Windows 上享受更棒的字体渲染
Python进行数据的排序和排名
Windows下利用winio库对 I/O 口进行操作
Win10/Win11怎么使用 Windows 文件资源管理器【详细介绍】
在 Intune 中为Windows 10 Windows 11设备创建 Windows 驱动程序更新策略
windows Shell 脚本语法
排序2
获取有关 Windows 11 中文件资源管理器的帮助 [指南]
网址: 在Windows上对一个非常大的(800GB)文本文件进行排序 sorting https://m.huajiangbk.com/newsview2396544.html