还有就是通过算法,把文件分成几块,每块分别排序,然后再是块与块之间的排序
具体的代码去找本<<数据结构>>,当中的排序算法中好像有一个快速算法可以这样用的。
具体的代码去找本<<数据结构>>,当中的排序算法中好像有一个快速算法可以这样用的。
解决方案 »
- 求一个解决办法,主从表的插入
- RichTextBox中字符的长度的问题
- 钩子问题
- 为何我的MDI父窗体只能打开一个子窗体?
- Data Application Block与强类型的DataSet使用时的问题.
- 解惑!在xsl中,有能实现类似静态变量的元素或方法吗?----xsl:variable 变量的循环递增问题!
- winform中的 DataGridView 的 AllowUserToDeleteRows属性怎么设置?
- 关于设置InternetSetCookie的问题
- 在xp下编的程序在2000下报错,大家来看看是怎么回事!
- 在web net 应用程序中,怎样使用树形控件
- 在asp.net中,DataGridview 可不可以实现隔行颜色的变化?
- combobox 绑定dataset
Unix下的sort似乎是写到/tmp下的缓存里面
这样总的读取硬盘记录数为2n(假设原文件共n行),写硬盘记录数也是2n,总IO记录数是4n
因为可能比较100次的时间也没一次IO操作久,所以最大限度减少IO操作,多比较几次问题不大了.
写记录次数: n*n - n 总合远大于 4n (n很大)
不信你试一下//那么StreamReader,每次只用读两行.进行冒泡排序
我倒认为这个方案可行,相邻行的读写,其实是缓冲区的内容
操作系统不会傻到读一行就把内部缓冲区清掉
写的过程恐怕要用临时文件
与ReadLine到数组
两种方式比较一下,哪个快,就知道了~
我总结了一下思路:
1.如果文件大小低于某个值(比如小于物理可用内存),可以全部读入物理内存进行排序
我的想法是定制一个结构,并实现IComparable接口,用Array.sort()方法进行排序。
2.如果文件大于某个值,全部读入内存会造成频繁使用虚拟内存。则将文件分割成几快,读入内存进行排序后形成几个临时文件。同时读取这几个临时文件,对几个文件中的内容进行排序,写入最后的结果文件。确实这样做“读取硬盘记录数为2n(假设原文件共n行),写硬盘记录数也是2n”,硬盘IO是最耗资源。
3.最后实现还是要考虑不少问题,比如内存使用大小和产生临时文件多少的平衡点。
欢迎大家继续讨论,找出更好的处理方法