导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
sxbug (太阳雨)
★☆☆☆☆
-
盒子活跃会员
2017/7/20 12:48:59
标题:
memo richedit 行数受限,有办法解决不?
浏览:1559
加入我的收藏
楼主:
memo richedit 都有行数限制?能突破不?620MB的文本文件,460万行,采用 lines.add(s) 方式添加,结果在lines.savetofile中保存的文件大小=0. 使用了 SendMessage(RichEdit1.Handle,EM_LIMITTEXT,$7FFFFFFE,0); SendMessage(RichEdit2.Handle,EM_LIMITTEXT,$7FFFFFFE,0);来解除限制,也不行。 请问高人,1、如何解除限制? 2、 有替代的控件不? 3、若采用流方式,是否可行? 谢谢
----------------------------------------------
-
作者:
2017/7/20 13:33:46
1楼:
用notepad++这类部分加载或者自己开发显示吧
----------------------------------------------
18114532@qq.com
作者:
2017/7/20 13:37:55
2楼:
有必要显示这么大的文件吗?
----------------------------------------------
-
作者:
sxbug (太阳雨)
★☆☆☆☆
-
盒子活跃会员
2017/7/20 14:28:51
3楼:
我现在想用 tmemorystream ,可有一点小问题 如何将 字符串 附加到 流中呢? FS1:= TMemoryStream.Create; 读入一个 字符串 s FS1.write(pansichar(s+inttostr($a)),200); //这里怎么写都有问题,就想把s附加在文件后面 FS1.savetofile('c:\1.txt'); 请高手指教 谢谢
----------------------------------------------
-
作者:
2017/7/20 14:36:00
4楼:
流有很多种,其中就有 StringStream 。 新版本 DLEPHI 的 StringStream 还支持多种编码。 但是 TStringList 更加简单。 但是,这些东西,都不能显示啊。 又有个屁用。
----------------------------------------------
(C)(P)Flying Wang
作者:
sxbug (太阳雨)
★☆☆☆☆
-
盒子活跃会员
2017/7/20 14:43:00
5楼:
不显示,再处理。首先要把数据弄出来啊 Tstringlist 怎么存成文件呢? 流把它弄成文件容易点吧 谢谢
----------------------------------------------
-
作者:
2017/7/20 14:47:51
5楼:
我建立了一个 txt 内容是瞎输入的。 不停的复制 大概 480 多万行。 80M 还多的容量。 用 MEMO 加载,也就是卡了一会。 过了一会,加载完毕,一行不少。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/7/20 14:52:41
6楼:
TStringList 存文件都不会,你还是放弃吧。 TStringList 加载速度很慢,而且容量太大,会报 Out of memory。 流不怕大容量,但是流不支持显示。 当然 TStringList 也不支持显示。
----------------------------------------------
(C)(P)Flying Wang
作者:
sxbug (太阳雨)
★☆☆☆☆
-
盒子活跃会员
2017/7/20 16:23:05
7楼:
奇怪的是 stringstream 也有问题,文件小,大约16MB,没有问题;太大就610MB,就有问题,savetofile 的到的文件=0byte。高手请指教。谢谢
----------------------------------------------
-
作者:
2017/7/20 16:43:03
8楼:
procedure TForm1.Button2Click(Sender: TObject); var AStrings: TStringStream; begin AStrings := TStringStream.Create; try AStrings.LoadFromFile('F:\TEMP\Test\b.txt'); AStrings.SaveToFile('F:\TEMP\Test\c.txt'); finally AStrings.Free; end; end; 加载和保存,都没有问题。 b.txt 636MB
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/7/20 17:27:06
9楼:
为什么要全部读到内存处理完了再写回去?难道一个文件有10G你也读入内存么?你可以用低级文件处理函数一行一行读取,或者用fileopen fileseek……文件处理函数。
----------------------------------------------
-
作者:
sxbug (太阳雨)
★☆☆☆☆
-
盒子活跃会员
2017/7/21 0:43:26
11楼:
定义了私有变量private FS1,FS2:TstringStream; 主函数: try FS1.LoadFromFile('c:\1.txt'); while FS1.Position<FS1.size do begin s:=''; s1:='';k:=0; while not ((s1=#$A) or (s1=#$D) or (k>1024)) do begin s1:=FS1.ReadString(1); s:=s+s1; k:=k+1; end; ChkDNA(s,'ATCGH'); end; finally FS1.clear; end; FS2.SaveToFile('c:\2.txt'); 在chkDNA 函数中: FS2.WriteString(s+#$D+#$A); 程序报错,out of memory. 因为处理小的文件,没有错误,处理大的文件才报错,又不好跟踪。只好再次请教大侠。谢谢
----------------------------------------------
-
作者:
2017/7/21 9:08:46
12楼:
用TFileStream即可: var s: string; ... with TFileStream.Create('C:\1.txt', fmOpenReadWrite, fmShareDenyWrite) do try Seek(0, soFromEnd); Write(PChar(s)^, Length(s)*SizeOf(Char)); finally Free; end;
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
sxbug (太阳雨)
★☆☆☆☆
-
盒子活跃会员
2017/7/21 14:21:20
13楼:
找到问题的地方了 就是在循环中 FS2.WriteString(s+#$D+#$A);这里 内存溢出。 FS2原则上不会大于 FS1,但不知道为什么,会内存溢出。请高人指教啊
----------------------------------------------
-
作者:
sxbug (太阳雨)
★☆☆☆☆
-
盒子活跃会员
2017/7/21 14:35:14
14楼:
内存管理是不是 FS1+FS2+FS3 + 其它数组 <2GB? FS2 流<2GB? 如何扩大内存的使用? 谢谢
----------------------------------------------
-
作者:
2017/7/21 16:30:40
15楼:
不知道你这个out of memory是谁的out of memory? 如果是程序总体的out of memory,那就是FS1+FS2使用的内存超过2G(实际1.7G就会溢出),也会out of memory。如果是FS2自己就弹出来out of memory,那另当别论。你好歹给个截图不是吗?
----------------------------------------------
只有偏执狂才能生存!
作者:
2017/7/21 17:15:55
16楼:
我前面写的你根本没看,如果是我来做,文件很大的时候根本不会用这种方式,如果一个文件有100G你是不是也要全部读入内存来操作?正确的方式应该打开文件然后从头开始,读取部分数据处理,边处理边移动文件指针,这样即使文件有10T大小(假设文件有这么大)我只需要很小的内存也能运行。去看看fileopen fileseek fileread…文档吧。
----------------------------------------------
-
作者:
sxbug (太阳雨)
★☆☆☆☆
-
盒子活跃会员
2017/7/23 10:32:46
17楼:
首先一并感谢所有高手们的指导。 今天我把FS2限制在200MB以下时,程序启动,占用内存约1.2GB,运行一段时间后,变成850MB左右。就是运行慢,后期处理非常麻烦,我把FS2达到200MB就存盘,就clear,然后想通过 winexec 执行 copy命令合并,居然没有任何作用。 自己对这个 流 没有弄得很明白。一个小问题,真的把我弄头大了。 我就是想实现一个这样的功能: 打开一个文本文件,(文件大就读入一部分行,不能打断一行数据)。对文本文件的每行数据进行比对,比对不匹配的,放到另一个流中,最后存盘。比对成功的,我放在一个Tstringlist中,在这个Tstringlist中需要统计 一样的字符串 有几个,最后也要存成一个文本文件(用流 替换 tstringlist可行不?)。 文件不大,怎么弄都行,文件大了,就很多地方出问题。 1、AssignFile(‘c:\1.txt’); Reset(txtFile); //以只读方式打开文件,打开大文件就出错?这个搞不懂 2、想编译成64位,是否能解决问题?perlregEX无法编译成64位,有pcre的64位版本不? 3、winexec 执行后台的copy ren 命令好像没有作用 再次请教!
----------------------------------------------
-
作者:
sxbug (太阳雨)
★☆☆☆☆
-
盒子活跃会员
2017/7/23 14:17:21
18楼:
@speedbin 我就是需要几个函数,1 打开文件,分块 读入内存。 2 打开文件,将字符串 写入文件 3 在打开的文件中搜索 指定的字符串,更改文件,指定位置的内容 高手麻烦指教。谢谢
----------------------------------------------
-
作者:
sxbug (太阳雨)
★☆☆☆☆
-
盒子活跃会员
2017/7/23 22:17:25
19楼:
上面的第2条,我就是希望实现,打开一个 文件,然后我不断在后面添加内容,它自动存盘,不占用过多内存。就是不断写到文件后面,而整体文件不全部放在内存中。
----------------------------------------------
-
作者:
2017/7/24 9:27:50
20楼:
12 楼就是答案,楼主真是浪费时间。
----------------------------------------------
(C)(P)Flying Wang