algorithm – sed optimization(基于较小数据集的大文件修改)

algorithm – sed optimization(基于较小数据集的大文件修改),第1张

概述我必须处理非常大的纯文本文件(超过10千兆字节,是的,我知道它取决于我们应该称之为大的),行很长. 我最近的任务涉及基于另一个文件的数据进行一些行编辑. 数据文件(应该被修改)包含1500000行,每行都是例如800个字符长.每一行都是唯一的,只包含一个身份z号码,每个身份z号码都是唯一的) 修饰符文件例如是1800行,包含一个标识号,以及应在数据文件中修改的数量和日期. 我只是将(使用Vim正则 @H_301_1@我必须处理非常大的纯文本文件(超过10千兆字节,是的,我知道它取决于我们应该称之为大的),行很长.

我最近的任务涉及基于另一个文件的数据进行一些行编辑.

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

修饰符文件例如是1800行,包含一个标识号,以及应在数据文件中修改的数量和日期.

我只是将(使用Vim正则表达式)修改器文件转换为sed,但效率非常低.

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

(some 500 character)ID_number(some 300 character)

我需要修改300个字符的数据.

基于修饰符文件,我想出了像这样的sed行:

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

所以我有1800条这样的线.

但我知道,即使是在速度非常快的服务器上,如果我这么做的话

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

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

有没有更好的方法?

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

解决方法 我建议的方法(按照希望的顺序)将处理这些数据:

>一个数据库(即使是一个带有索引的简单的基于sqlite的数据库也会比10GB文件上的sed / awk表现更好)
>包含固定记录长度的平面文件
>包含可变记录长度的平面文件

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

如果你想坚持使用平面文件,你需要在大文件旁边手动维护一个索引,这样你就可以更容易地查找你需要 *** 作的记录号.或者,更好的是,也许您的身份z号码是您的记录号码?

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

总结

以上是内存溢出为你收集整理的algorithm – sed optimization(基于较小数据集的大文件修改)全部内容,希望文章能够帮你解决algorithm – sed optimization(基于较小数据集的大文件修改)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/1033361.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存