我有一个文本文件,每行一个单词,文件大小为 800GB。我需要按字母顺序对单词进行排序。
我曾尝试使用Windows 排序程序使用:
sort.exe input.txt /o output.txt
Run Code Online (Sandbox Code Playgroud)
这给出了错误:没有足够的主内存来完成排序。
我有 32GB 的RAM,所以当我尝试使用以下命令为排序指定 10GB 的内存时:
sort.exe input.txt /o output.txt /M 10000000
Run Code Online (Sandbox Code Playgroud)
我得到:
警告:指定的内存大小正在减少到可用的分页内存。
输入记录超过最大长度。指定更大的最大值。
我有哪些选择?
Pet*_*r H 23
另一种选择是将文件加载到数据库中。EG MySQL 和 MySQL 工作台。
数据库是处理大文件的完美候选者
如果您的输入文件只包含由新行分隔的单词,这应该不难。
在您安装了数据库和 MySQL Workbench 之后,这就是您需要做的。
首先创建模式(假设单词不会超过 255 个字符,尽管您可以通过增加参数值来改变它)。第一列“idwords”是主键。
CREATE SCHEMA `tmp` ;
CREATE TABLE `tmp`.`words` (
`idwords` INT NOT NULL AUTO_INCREMENT,
`mywords` VARCHAR(255) NULL,
PRIMARY KEY (`idwords`));
Run Code Online (Sandbox Code Playgroud)
其次导入数据: EG 这会将所有单词导入表中(此步骤可能需要一段时间才能完成。我的建议是先使用一个小单词文件运行测试,一旦您确定格式与较大的(截断表.. IE 清除它并加载完整的数据集)。
LOAD DATA LOCAL INFILE "C:\\words.txt" INTO TABLE tmp.words
LINES TERMINATED BY '\r\n'
(mywords);
Run Code Online (Sandbox Code Playgroud)
此链接可能有助于获得适合加载的格式。
https://dev.mysql.com/doc/refman/5.7/en/load-data.html
EG 如果您需要跳过第一行,您可以执行以下操作。
LOAD DATA LOCAL INFILE "H:\\words.txt" INTO TABLE tmp.words
-- FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(mywords);
Run Code Online (Sandbox Code Playgroud)
最后保存排序后的文件。这可能需要一段时间也取决于您的电脑。
SELECT tmp.words.mywords
FROM tmp.words
order by tmp.words.mywords asc
INTO OUTFILE 'C:\\sorted_words.csv';
Run Code Online (Sandbox Code Playgroud)
您也可以随意搜索数据。EG 这将为您提供按升序排列的前 50 个单词(从第 0 个或第一个单词开始)。
SELECT tmp.words.mywords
FROM tmp.words
order by tmp.words.mywords asc
LIMIT 0, 50 ;
Run Code Online (Sandbox Code Playgroud)
祝你好运
皮特
Dav*_*ill 16
它使用多个临时文件,然后在最后合并它们。
CMsort 正在读取输入文件的记录,直到达到调整后的内存。然后将记录排序并写入临时文件。这将重复进行,直到处理完所有记录。最后,所有临时文件都合并到输出文件中。如果可用内存足够,则不会写入临时文件,也无需合并。
一位用户报告说它对一个 130,000,000 字节的文件进行了排序。
如果你想自己调整一些代码,还有排序巨大的文本文件 - CodeProject - “文本文件大小超过可用内存的排序算法”
sort有许多算法用于对有序文件和非有序文件进行排序[ 1 ]。
由于所有这些算法都已经实现,选择一个已经测试过的程序。
在coreutils (来自 Linux,但也可用于 Windows [ 2 ])中,它存在sort能够在多核处理器下并行运行的命令:通常就足够了。
如果您的文件太大,您可以帮助处理拆分 ( split -l),将文件分成一些块,可能使用并行选项 ( --parallel),并使用选项 (合并排序)对生成的有序块进行排序。此处
解释了执行此操作的多种方法之一(拆分文件、对单个块进行排序、合并已排序的块、删除临时文件)。-m
笔记:
| 归档时间: |
|
| 查看次数: |
13506 次 |
| 最近记录: |