gpt4 book ai didi

algorithm - sed优化(基于较小数据集的大文件修改)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:32:17 25 4
gpt4 key购买 nike

我确实必须处理非常大的纯文本文件(超过 10 GB,是的,我知道这取决于我们应该称之为大),行非常长。

我最近的任务是根据另一个文件中的数据进行一些行编辑。

数据文件(应该修改)包含1500000行,每一行都是例如800 个字符长。每一行都是唯一的,并且只包含一个身份号码,每个身份号码都是唯一的)

修饰 rune 件是例如1800 行长,包含一个身份号码,以及应在数据文件中修改的金额和日期。

我只是将修饰 rune 件(使用 Vim 正则表达式)转换为 sed,但效率很低。

假设我在数据文件中有这样一行:

(some 500 character)id_number(some 300 character)

并且我需要修改300个字符部分的数据。

基于修改器文件,我想出了这样的 sed 行:

/id_number/ s/^\(.\{650\}\).\{20\}/\1CHANGED_AMOUNT_AND_DATA/

所以我有 1800 行这样的代码。

但我知道,即使在非常快的服务器上,如果我执行

sed -i.bak -f modifier.sed data.file

它非常慢,因为它必须读取每行 x 的每个模式。

有没有更好的办法?

注意:我不是程序员,从未(在学校)学过算法。我可以在服务器上使用 awk、sed 和 perl 的过时版本。

最佳答案

我建议的方法(按理想顺序)是将这些数据处理为:

  1. 一个数据库(即使是一个简单的基于 SQLite 的带有索引的数据库在 10GB 文件上的性能也比 sed/awk 好得多)
  2. 包含固定记录长度的平面文件
  3. 包含可变记录长度的平面文件

使用数据库可以处理所有那些减慢文本文件处理速度的小细节(查找您关心的记录、修改数据、将其存储回数据库)。在 Perl 的情况下查看 DBD::SQLite。

如果您想坚持使用平面文件,则需要在大文件旁边手动维护一个索引,这样您就可以更轻松地查找需要处理的记录编号。或者,更好的是,也许您的 ID 号 是您的记录号?

如果您的记录长度可变,我建议您转换为固定记录长度(因为看起来只有您的 ID 是可变长度的)。如果您不能这样做,也许任何现有数据都不会在文件中移动?然后您可以维护前面提到的索引并根据需要添加新条目,不同之处在于索引不再指向记录号,而是指向文件中的绝对位置。

关于algorithm - sed优化(基于较小数据集的大文件修改),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/848914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com