处理具有非常大记录长度的大型平面数据文件

时间:2010-06-11 13:50:14

标签: c

我有一个从shell脚本创建的大型数据文件。下一个脚本通过多次排序和读取来处理它。这需要超过14个小时;它不可行。 我想用一个程序替换这个长时间运行的脚本,可能是在JAVA,C或COBOL中,可以在Windows或Sun Solaris上运行。我必须每次都读取一组记录,排序和处理并写入输出排序文件,同时插入到db2 / sql表中。

2 个答案:

答案 0 :(得分:1)

如果你将它们插入到数据库中,那么自己不进行排序可能要简单得多,但只要在插入数据后就接收从数据库中订购的数据。

答案 1 :(得分:0)

可能会加快排序速度的是改变数据生成脚本,根据您将用于对条目进行排序的键的所有或前缀将数据放入不同的文件中。

然后,当您对条目进行实际排序时,您可以将排序限制为仅适用于较小的文件,这会(几乎)将您的排序时间从O( f(N) )变为O( f(n0) + f(n1) + ... ),对于任何{比f()更复杂的{1}}应该更小(更快)。

这也将开启同时对文件进行排序的可能性,因为一个排序线程的磁盘IO等待时间是另一个线程实际对其加载的记录进行排序的好时机。

您需要在太多文件和太多文件之间找到一个愉快的平衡点。 256个文件是一个很好的起点。

您可能想要研究的另一件事是您的排序算法。合并排序适用于二级存储排序。替换选择排序也是用于二级存储排序的好算法。

http://www.cs.auckland.ac.nz/software/AlgAnim/niemann/s_ext.htm

以大块(文件系统块大小对齐的块最好)执行文件IO在大多数情况下也会有所帮助。

如果您确实需要使用关系数据库,那么您可以继续将所有内容放在那里开始。 RDBMS通常具有非常好的算法来处理所有这些棘手的事情。