[TL][讨论]操作大文件的效率问题

257 views
Skip to first unread message

Bear King

unread,
May 21, 2010, 5:31:09 AM5/21/10
to pon...@googlegroups.com
打开大文件的效率问题,这里的大文件是大概100M以上的文本文件。
1. 使用notepad,或者notepad++,都非常慢,而且会僵住;resize一下UI界面,例如最大化,速度也很慢
大概看了一下notepad++的源代码,里面是直接用c的库,fopen之类的来操作文件。
2. 使用UltraEdit,速度非常快,而且拖动滚动条刷新内容都很快。但是看不到它的源码,不知道实现细节。

请问:
UltraEdit使用了什么特别的技术来操作文件?

jinhu wang

unread,
May 21, 2010, 6:07:35 AM5/21/10
to pon...@googlegroups.com
想到了设计模式的享元模式

江云帆

unread,
May 21, 2010, 6:08:02 AM5/21/10
to pon...@googlegroups.com
memset?

2010/5/21 Bear King <king.b...@gmail.com>



--
welcom to gtalk me
http://hi.baidu.com/jyf1987

XIN, Wang

unread,
May 21, 2010, 6:34:29 AM5/21/10
to pon...@googlegroups.com
Notepad++ 好像是因为使用了按行存储的机制(也是大多数编辑器采用得机制),如果打开非文本文件几十兆就会使他僵住。

2010/5/21 江云帆 <jyf...@gmail.com>

pi1ot

unread,
May 21, 2010, 7:02:55 AM5/21/10
to TopLanguage
刚看到题目时我以为是文件io操作,那样一般是用mmap。
如果是涉及ui的应该是需要自己做个中间层吧,细节一下子也想不太完全。
除了ue,vi/vim操作大文件也很顺畅,可以看看代码。

Fei Yan

unread,
May 21, 2010, 8:00:45 AM5/21/10
to pon...@googlegroups.com
vim打开几十MB的文本文件,速度也算够呛的
在Unix/Linux下,head/tail/split确是可以大派用场

在 2010年5月21日 下午7:02,pi1ot <pilot.cn@gmail.com>写道:= 

up duan

unread,
May 21, 2010, 9:25:58 AM5/21/10
to pon...@googlegroups.com


2010/5/21 XIN, Wang <xer...@gmail.com>
Notepad++ 好像是因为使用了按行存储的机制(也是大多数编辑器采用得机制),如果打开非文本文件几十兆就会使他僵住。

按行处理并不是导致慢的理由,EmEditor就是按行处理的,但是大文件很快。

redsea

unread,
May 21, 2010, 9:30:58 AM5/21/10
to TopLanguage
问题不在于 fopen , 而是编辑器内部的数据结构问题.
我做过一个编辑器, 要在 4.77M 的cpu 上面运行, 所以知道这个问题.

Bear King

unread,
May 21, 2010, 9:51:59 AM5/21/10
to pon...@googlegroups.com
关于编辑器内部数据机构问题,我比较赞同,不过不了解细节。
理由:在拉滚动条的时候,UE明显比notepad++流畅很多,我想这应该是编辑器内部处理的原因。

对于纯粹的打开大文件,我怀疑:
对于大文件,是不是有fopen,fread效率不是很高,而UE做过底层的改进?


2010/5/21 redsea <red...@gmail.com>:

qiaojie

unread,
May 21, 2010, 10:09:52 AM5/21/10
to pon...@googlegroups.com
做过文本编辑器的同学应该会比较熟悉,主要瓶颈在格式化上,一个文本要显示在屏幕上要经过格式化,先把文本切分出段落,再把段落切成行,切行的时候需要一个字符一个字符的数宽度,一般的编辑器都是针对整个文本进行格式化的,所以文本大了会比较慢。如果编辑器是针对大文本优化的话,那么只会格式化当前显示的那部分,所以速度就快了。


 
2010/5/21 Bear King <king.b...@gmail.com>

猛禽

unread,
May 21, 2010, 11:56:25 AM5/21/10
to TopLanguage
很多年不用UE了,记得以前UE是在设置里有一个选项可以选择对超大文件的快速浏览,关闭这个选项后与其它编辑器差不多慢。不过这个可能会损失部分文本
操作功能。UE之所以有这样的功能,估计是因为它支持HEX编辑需要----需要HEX编辑的通常都是超大文件。

On 5月21日, 下午5时31分, Bear King <king.bear...@gmail.com> wrote:

Yongwei Wu

unread,
May 21, 2010, 11:26:37 PM5/21/10
to pon...@googlegroups.com
有脚本专门优化Vim打开大文件的。缺省情况下Vim会准备崩溃恢复文件和undo记录。大文件不编辑的话,不需要这些。

2010/5/21 Fei Yan <skyscr...@gmail.com>:
> vim打开几十MB的文本文件,速度也算够呛的
> 在Unix/Linux下,head/tail/split确是可以大派用场
> 在 2010年5月21日 下午7:02,pi1ot <pilo...@gmail.com>写道:=


>>
>> 刚看到题目时我以为是文件io操作,那样一般是用mmap。
>> 如果是涉及ui的应该是需要自己做个中间层吧,细节一下子也想不太完全。
>> 除了ue,vi/vim操作大文件也很顺畅,可以看看代码。
>>
>> On 5月21日, 下午5时31分, Bear King <king.bear...@gmail.com> wrote:
>> > 打开大文件的效率问题,这里的大文件是大概100M以上的文本文件。
>> > 1. 使用notepad,或者notepad++,都非常慢,而且会僵住;resize一下UI界面,例如最大化,速度也很慢
>> > 大概看了一下notepad++的源代码,里面是直接用c的库,fopen之类的来操作文件。
>> > 2. 使用UltraEdit,速度非常快,而且拖动滚动条刷新内容都很快。但是看不到它的源码,不知道实现细节。
>> >
>> > 请问:
>> > UltraEdit使用了什么特别的技术来操作文件?
>

--
Wu Yongwei
URL: http://wyw.dcweb.cn/

windam

unread,
May 22, 2010, 11:57:01 AM5/22/10
to pon...@googlegroups.com
我想起来一个类似的东西:
Windows的列表控件ListCtrl有一种Virtual模式。假若有很大数量的Item被放入控件中,会导致速度变得很慢。但是采用Virtual的类型,界面需要显示哪些Item,就通过索引的方式让程序提供显示所需的信息。

觉得两者可能有相通的地方:
因为UE打开文件之后能够立时显示出来,猜测UE可能只对当前界面上显示的文件内容做实时读取,非显示区域的内容可能会延后或者当滚轮转到的时候再读。

在 2010年5月21日 下午5:31,Bear King <king.b...@gmail.com>写道:

arnk

unread,
May 22, 2010, 12:41:24 PM5/22/10
to pon...@googlegroups.com
vim试过编辑过上G的,速度还是可以的。
--
.(){ .|.& };.

bug

unread,
May 23, 2010, 1:15:27 AM5/23/10
to pon...@googlegroups.com
貌似都没说到重点?内存文件映射技术啊

2010/5/23 arnk <ludo...@gmail.com>

Changjian Gao

unread,
May 23, 2010, 10:09:48 AM5/23/10
to pon...@googlegroups.com
可以参考UNIX/Linux中less命令的实现, less和Vim打开大文件的速度差别是很明显的.

2010/5/23 bug <bug...@gmail.com>



--
Home: http://www.xiaogaozi.org/
Blog: http://blog.xiaogaozi.org/
Twitter: http://twitter.com/xiaogaozi

陨落雕

unread,
May 23, 2010, 3:57:11 PM5/23/10
to TopLanguage
mmap不是重点。mmap只是一个自然的扩展,实质就是用内存做cache来操作磁盘文件,只不过是由内核实现的罢了。就算是现在一个实现得特别差的
文本编辑器是直接把100mb的文本文件读入到内存也就2~3s的事情,然后在内存中操作很快了。100mb以上的文本文件打开的速度瓶颈是语法高亮和
自动换行计算。

On May 23, 1:15 am, bug <bugh...@gmail.com> wrote:
> 貌似都没说到重点?内存文件映射技术啊
>
> 2010/5/23 arnk <ludo.a...@gmail.com>
>
>
>
> > vim试过编辑过上G的,速度还是可以的。


>
> > 在 2010年5月22日 下午11:57,windam <windameis...@gmail.com>写道:
>
> > 我想起来一个类似的东西:
>

> >> Windows的列表控件ListCtrl有一种Virtual模式。假若有很大数量的Item被放入控件中,会导致速度变得很慢。但是采用Virtual的类 型,界面需要显示哪些Item,就通过索引的方式让程序提供显示所需的信息。
>
> >> 觉得两者可能有相通的地方:
> >> 因为UE打开文件之后能够立时显示出来,猜测UE可能只对当前界面上显示的文件内容做实时读取,非显示区域的内容可能会延后或者当滚轮转到的时候再读。

Bear King

unread,
May 23, 2010, 9:40:08 PM5/23/10
to pon...@googlegroups.com
那么是不是将notepad++里面的语法去掉,自动换行去掉,是不是会快很多?
还是在处理文件中的 \r\n 的时候,性能很慢?

2010/5/24 陨落雕 <geo...@gmail.com>:

Kenny Yuan

unread,
May 23, 2010, 10:06:35 PM5/23/10
to pon...@googlegroups.com
写点相关的东西,不完全切题:

文本编辑器很容易做,做好了很难

七八年前,许多编辑器都处理不了超长的行,有些会强制插入物理回车(比如UltraEdit每2048就强插),有些会直接crash,有些会慢得要死(特别是加上自动换行时,要论小时地等)。如果自动换行后的一个超长行的内容会超过一屏幕,那么在计算屏幕和文本座标关系时的许多“天真”的假设就失效了,有些会不能正常移动光标,严重的就会crash

大文件支持是一个见功力的地方,传统上来说,你把所有的文件内容都读入内存,分行存储,处理虚拟回车(自动换行),累计高度就能计算滚动条和处理Point2LineCol等操作,但是碰到了超大文件,你就不能这样做了,而且有些原来看起来合理的计算方式也慢得不能接受。

分辨率的支持也是个问题,不仅仅大分辨率会造成性能问题,“怪异”的分辨率也会——当然,这个往往是表象而不是root cause。比如EmEditor,打开GB级的文件也超快,但是在1050*1680分辨率下打开小文件却运行不正常,一碰滚动条就慢得要死,大约论10秒种才能更新(因为没有源码,我不知道它问题出在哪)

编码也是造成编辑器性能问题的一个因素,不能简短地说清楚,我就不多展开了。(同类的还有纠错/高亮/格式化等功能)

暂时就说到这里吧,其实从我个人的标准来说,我不认为“做好了很难”,我觉得“那是你应该做的” (对此观点曾写过blog entry),但事实上,做好了的产品太少,以至于事实上就成了“做好了很难”……


--
Kenny Yuan
-->CS, MMA, Psychology, Automobile...
http://twitter.com/kenny_yuan
http://csbabel.wordpress.com/
http://blog.csdn.net/yuankaining/

Bear King

unread,
May 24, 2010, 6:18:41 AM5/24/10
to pon...@googlegroups.com

通过LTProf的结果来看,的确是在Editor部分消耗了大部分时间. (顺便问一句,gmail网页里面如何attach一个图片?)

Open a txt file, about 400MB, without auto-wrap. (附件中)


2010/5/24 Kenny Yuan <yuank...@gmail.com>
aaa.jpg

qiaojie

unread,
May 24, 2010, 6:28:17 AM5/24/10
to pon...@googlegroups.com
既然你认为不难做,那何不自己动手做一个完美的文本编辑器,等做出来了再来看看是不是难。

2010/5/24 Kenny Yuan <yuank...@gmail.com>

Kenny Yuan

unread,
May 24, 2010, 6:47:01 AM5/24/10
to pon...@googlegroups.com
怎么又是这种论调……

周迪

unread,
May 24, 2010, 7:21:07 AM5/24/10
to pon...@googlegroups.com
我觉得这个是两个不同风格的吧?原来自己特崇拜那些不好用就自己写一个的大牛,好像国外这种人特别多,貌似是UNIX精神。但是现在公司的大牛就崇尚能用现成的就用,反对重复造轮子。
所以可能就具体问题具体分析了

--------Original Message--------

From: yuank...@gmail.com
To: pon...@googlegroups.com
Subject: Re: [TL] Re: [讨论]操作大文件的效率问题
怎么又是这种论调……

在 2010年5月24日 下午6:28,qiaojie <qia...@gmail.com>写道:

> 既然你认为不难做,那何不自己动手做一个完美的文本编辑器,等做出来了再来看看是不是难。
>
> 2010/5/24 Kenny Yuan <yuank...@gmail.com>
>
>> 写点相关的东西,不完全切题:
>>
>>

>> *文本编辑器很容易做,做好了很难*


>>
>>
>> 七八年前,许多编辑器都处理不了超长的行,有些会强制插入物理回车(比如UltraEdit每2048就强插),有些会直接crash,有些会慢得要死(特别是加上自动换行时,要论小时地等)。如果自动换行后的一个超长行的内容会超过一屏幕,那么在计算屏幕和文本座标关系时的许多“天真”的假设就失效了,有些会不能正常移动光标,严重的就会crash
>>
>>
>> 大文件支持是一个见功力的地方,传统上来说,你把所有的文件内容都读入内存,分行存储,处理虚拟回车(自动换行),累计高度就能计算滚动条和处理Point2LineCol等操作,但是碰到了超大文件,你就不能这样做了,而且有些原来看起来合理的计算方式也慢得不能接受。
>>
>> 分辨率的支持也是个问题,不仅仅大分辨率会造成性能问题,“怪异”的分辨率也会――当然,这个往往是表象而不是root
>> cause。比如EmEditor,打开GB级的文件也超快,但是在1050*1680分辨率下打开小文件却运行不正常,一碰滚动条就慢得要死,大约论10秒种才能更新(因为没有源码,我不知道它问题出在哪)
>>
>> 编码也是造成编辑器性能问题的一个因素,不能简短地说清楚,我就不多展开了。(同类的还有纠错/高亮/格式化等功能)
>>

>> 暂时就说到这里吧,其实从我个人的标准来说,我不认为“做好了很难”,我觉得“那是你应该做的” (对此观点曾写过blog entry<http://csbabel.wordpress.com/2009/12/04/what-you-should-do/>

Bennie

unread,
May 25, 2010, 12:42:18 AM5/25/10
to TopLanguage
用户描绘的慢通常是一个很含糊的概念,具体到程序上,除了基于内容的优化和缓存处理外,很多程序没优化UI操作手感。
比如很多程序直接以阻塞的方式打开大文件,这样迟滞感非常明显,而如果做一个异步加载,然后优先显示部分内容的话,用户就不会有那么明显的感觉。


On May 24, 7:21 pm, 周迪 <zhoudi77...@gmail.com> wrote:
> 我觉得这个是两个不同风格的吧?原来自己特崇拜那些不好用就自己写一个的大牛,好像国外这种人特别多,貌似是UNIX精神。但是现在公司的大牛就崇尚能用现成的 就用,反对重复造轮子。
> 所以可能就具体问题具体分析了
>
>
>
> --------Original Message--------


>
> From: yuankain...@gmail.com
> To: pon...@googlegroups.com
> Subject: Re: [TL] Re: [讨论]操作大文件的效率问题
>

> 怎么又是这种论调......


>
> 在 2010年5月24日 下午6:28,qiaojie <qiao...@gmail.com>写道:
>
> > 既然你认为不难做,那何不自己动手做一个完美的文本编辑器,等做出来了再来看看是不是难。
>

> > 2010/5/24 Kenny Yuan <yuankain...@gmail.com>
>
> >> 写点相关的东西,不完全切题:
>
> >> *文本编辑器很容易做,做好了很难*
>
> >> 七八年前,许多编辑器都处理不了超长的行,有些会强制插入物理回车(比如UltraEdit每2048就强插),有些会直接crash,有些会慢得要死(特别是 加上自动换行时,要论小时地等)。如果自动换行后的一个超长行的内容会超过一屏幕,那么在计算屏幕和文本座标关系时的许多"天真"的假设就失效了,有些会不能正 常移动光标,严重的就会crash
>
> >> 大文件支持是一个见功力的地方,传统上来说,你把所有的文件内容都读入内存,分行存储,处理虚拟回车(自动换行),累计高度就能计算滚动条和处理Point2L ineCol等操作,但是碰到了超大文件,你就不能这样做了,而且有些原来看起来合理的计算方式也慢得不能接受。
>
> >> 分辨率的支持也是个问题,不仅仅大分辨率会造成性能问题,"怪异"的分辨率也会----当然,这个往往是表象而不是root
> >> cause。比如EmEditor,打开GB级的文件也超快,但是在1050*1680分辨率下打开小文件却运行不正常,一碰滚动条就慢得要死,大约论10秒种 才能更新(因为没有源码,我不知道它问题出在哪)


>
> >> 编码也是造成编辑器性能问题的一个因素,不能简短地说清楚,我就不多展开了。(同类的还有纠错/高亮/格式化等功能)
>
> >> 暂时就说到这里吧,其实从我个人的标准来说,我不认为"做好了很难",我觉得"那是你应该做的" (对此观点曾写过blog entry<http://csbabel.wordpress.com/2009/12/04/what-you-should-do/>

> >> ),但事实上,做好了的产品太少,以至于事实上就成了"做好了很难"......

pi1ot

unread,
May 25, 2010, 3:15:03 AM5/25/10
to TopLanguage
之前做过一个以ajax方式加载较多数据的html,多人反应浏览器打开时容易僵死,改为页面载入后延迟半秒再加载数据,就没人投诉了。

> > -->CS, MMA, Psychology, Automobile...http://twitter.com/kenny_yuanhttp://csbabel.wordpress.com/http://blog...

Yongwei Wu

unread,
May 25, 2010, 9:49:47 PM5/25/10
to pon...@googlegroups.com
从逻辑上讲,qiaojie的回复没有问题。你自己说“不认为‘做好了很难’”。事实上,你一会儿说做好了很难,一会儿又似乎说不难,我都不明白你到底认为难不难了。:-)

我对Vim的代码相对比较熟悉。想做一个中文断行方面的改进,都过去几年了,还是没有着手去做。确实应该不难,可实际上工程问题很少有不难的。得有人花力气去解决。很少有人愿意去做那个人。

扯远了。

2010/5/24 Kenny Yuan <yuank...@gmail.com>:

--

Kenny Yuan

unread,
May 25, 2010, 11:20:29 PM5/25/10
to pon...@googlegroups.com
从逻辑上讲,我不去下蛋也可以说母鸡下蛋难,或者不难。完毕。

Yongwei Wu

unread,
May 25, 2010, 11:25:32 PM5/25/10
to pon...@googlegroups.com
取决于你是不是母鸡,证明方法的要求会不一样。:-)

2010/5/26 Kenny Yuan <yuank...@gmail.com>:

HaoPeiQiang

unread,
May 25, 2010, 11:27:39 PM5/25/10
to pon...@googlegroups.com
好吧,因为我见过Kenny Yuan同学的面,我负责任的证明,他确实不是母鸡。

2010/5/26 Yongwei Wu <wuyo...@gmail.com>:

--
Tinyfool的开发日记 http://www.tinydust.net/dev/
代码中国网 http://www.codechina.org
myTwitter: http://twitter.com/tinyfool

qiaojie

unread,
May 25, 2010, 11:51:24 PM5/25/10
to pon...@googlegroups.com
其实我想说的意思,对于一个实际的工程来说,如果你没有做过就不要轻易的下结论,程序员总是会过分乐观的估计工作量。
设计一个处理超大文本的算法确实不难,但是要把各种功能,用户体验,可靠性,性能等等因素都考虑进去并且在有限的人力和时
间预算内实现就不是件容易的事情。很多设计目标都不是正交的,为了性能就可能不得不砍掉某些功能,做了优化就会提升系统复
杂性而降低可靠性。

 
2010/5/26 Yongwei Wu <wuyo...@gmail.com>

Kenny Yuan

unread,
May 26, 2010, 12:22:28 AM5/26/10
to pon...@googlegroups.com
这个说法比较靠谱

Kenny Yuan

unread,
May 26, 2010, 12:25:38 AM5/26/10
to pon...@googlegroups.com
我做过文本编辑器/十六进编辑器若干次,全是从头做涡翼鸥。其中的某一次做的文本编辑器可以支持GB级文件打开。我也看过许多文本编辑器的源码,质量高的没见过几个,质量低的看过不少。所以我可以承诺前面说的话是靠经验而不是想像——不知道说完了这些,是不是就获得了母鸡的资格了?

下面你也来证明一下你的资格吧,请回答:50M个文字+自动换行,对编辑器的实现有什么要求?

Yongwei Wu

unread,
May 26, 2010, 2:19:18 AM5/26/10
to pon...@googlegroups.com
如果你是母鸡,那你说生蛋不难的最好方法就是演示一下确实不难。

如果你不是,就更得靠经验数据了。

我不是母鸡,所以我不会随便说生蛋不难。你是母鸡,又说了生蛋不难,那qiaojie的反问就很正常了。

2010/5/26 Kenny Yuan <yuank...@gmail.com>:

Yongwei Wu

unread,
May 26, 2010, 2:21:01 AM5/26/10
to pon...@googlegroups.com
正解。早看这封,就不需要跟Kenny争了。呵呵。

2010/5/26 qiaojie <qia...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages