|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2018/9/2 22:40:05 |
标题: |
|
加入我的收藏 |
楼主: |
有一个文本文件数据,文件大小900M左右,每一行数据格式都是一样的,有没有快速的方法读取每一行数据,然后处理。
----------------------------------------------
- |
作者: |
|
2018/9/2 23:06:33 |
1楼: |
读取只能按常规方法读。 比如映射到内存里,比如自己做一个大小是系统页大小倍数的内存空间去读。
另外,所谓的处理就看你是什么意思了。
----------------------------------------------
--
|
作者: |
|
2018/9/3 6:35:35 |
2楼: |
处理可能是显示某几列数据或者将其中的几列单独提取到一个文件 注:txt每一列格式为用空格或/Tab分割的几个参数,就形成了行和列
----------------------------------------------
-
|
作者: |
|
2018/9/3 8:03:57 |
3楼: |
既然格式一样,导入数据库,处理起来岂不是很方便?
----------------------------------------------
武汉天气不好
|
作者: |
|
2018/9/3 11:22:15 |
4楼: |
stream 处理吧 总归是要一行一行循环下去的 再快的算法也要 N 次
----------------------------------------------
-
|
作者: |
|
2018/9/3 12:08:15 |
5楼: |
导到数据库里处理是正道,不用折腾
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier 缘在上海
|
作者: |
|
2018/9/3 12:39:30 |
6楼: |
快速是个相对概念,你的快是指1分钟内处理完成还是1秒钟内处理完成。 你的处理是怎么处理的?
----------------------------------------------
武稀松http://www.raysoftware.cn
|
作者: |
|
2018/9/3 14:16:28 |
7楼: |
数据量很大,如果不需要过滤特定行,可以使用虚拟加载这类技术,按需加载,因为你不可能同时把这么多数据显示出来。在相应事件(比如TListView.OnData)里定位到特定行,并记录已读取过的每一行数据在文件中的偏移量。
如果只是经过处理后,选择性写入另外一个文件,那就简单了,用TextFile每次读取一行循环就行了。
纯文本文件没有任何索引信息,只能逐行读取,无法取巧的。只能说用TStringList加载,然后内部用另外一个StringList的DelimitedText进行分割肯定是很慢的,消耗内存也大。内存足够,不在乎就无所谓了。
----------------------------------------------
这家伙很懒,什么都没有留下。
|
作者: |
|
2018/9/3 20:43:33 |
8楼: |
我写的一个SuperCSV专门处理CSV的工具, 支持筛选 打开超过10G以上的巨大CSV文件(采用分页方式)
----------------------------------------------
火鸟
|
作者: |
|
2018/9/3 21:44:53 |
9楼: |
@wac1104 用了下,数据只能提取两千行,后面的就没有了,我的数据有8w行,每行有400列。 不过能否说下具体实现,可以借鉴一下
----------------------------------------------
-
|
作者: |
|
2018/9/4 7:29:54 |
10楼: |
@sdzzb 可以 翻页的 另外可以导出 ,导出就是全部的
----------------------------------------------
火鸟
|
作者: |
|
2018/9/4 10:03:40 |
11楼: |
数据库最快,其他都不快。900M的文本,读出来都很慢
----------------------------------------------
-
|
作者: |
|
2018/9/4 10:38:37 |
12楼: |
鸟哥做专用文件,自已定专用格式,比通用数据库快
----------------------------------------------
-
|
作者: |
|
2018/9/4 14:37:52 |
13楼: |
可以考虑用elasticsearc
----------------------------------------------
-
|
作者: |
|
2018/9/4 14:55:54 |
14楼: |
900M文件不算大呀。导入到数据库里操作是方便了,但时间也长,如果不是专门的数据库需求可以用直接读文件的方法。
----------------------------------------------
-
|
作者: |
|
2018/9/4 15:09:28 |
15楼: |
关键还是看文件内容还有要干什么。 比如每行长度固定,要处理的数据行内位置固定,数据需要逐行处理, 那不断seek,read可能很好。 但如果需要处理的操作稍微有点要求,导入数据库处理几乎是绝对的首选。
----------------------------------------------
-
|
作者: |
|
2018/9/4 15:44:09 |
16楼: |
只能根据数据特点做相应的处理了,用指针移位操作还是相对比较快的。
----------------------------------------------
18114532@qq.com
|
作者: |
|
2018/9/5 16:17:28 |
17楼: |
居然有人说数据库最快的。。。
----------------------------------------------
--
|
作者: |
|
2018/9/5 16:30:26 |
18楼: |
数据库当然是最快的,我同意。我也是最近才认识到这个思路,如果数据比较规范,一定要转换成数据库,不但速度快,而且为所欲为,因为SQL就是你的菜,否则你要写出无数个高效率的文本函数,才能提供SQL的一部分功能。
----------------------------------------------
只有偏执狂才能生存!
|
作者: |
|
2018/9/5 20:09:02 |
19楼: |
快是相对的,看你做什么,某些时候文本确实比数据库快,越通用性能越低,越专性能越高。如果只考虑只读情形。确实文本可以做的比数据库快很多。(在数据库不加索引情形下)
----------------------------------------------
火鸟
|
作者: |
|
2018/9/5 22:29:19 |
20楼: |
数据量大还是用文本读取方式快,看dev的searchlist的DEMO用文本加载30几万条数据也就是1到2秒的时间,
----------------------------------------------
-
|
作者: |
|
2018/9/6 5:26:53 |
21楼: |
经过数据库是不可能比直接读数据快的了,建议额外生成一个索引表, 用固定格式记住每行,每列的起始位置,关键词等等。
----------------------------------------------
声明:本人不在论坛询问任何编程问题,请不要将我的帖子当成问题来回答。炒股一天,编程三年,不浪费时间了。 经常在外面,没空,不要找我..
|
作者: |
|
2018/9/7 8:54:16 |
22楼: |
900M读取也很快的,每次读10M。你要一个一个字符读检查是不是换行那肯定慢……
----------------------------------------------
这家伙很懒,什么都没有留下。
|
作者: |
|
2018/9/7 9:11:28 |
23楼: |
实际上, 一个一个字符读检查是不是换行也不会慢到哪去...... 一个一个字符做加法拼字符串那才是慢的原因...
现代操作系统的优化, 不管你是一个一个字符读取还是64K一块一块地读取, 性能差距不过是在10%以内.... 会拖慢性能的只会是你自己的代码
----------------------------------------------
-
|
作者: |
|
2018/9/7 9:38:50 |
24楼: |
一堆老黄历。 delphi 的 string 变量,也是有改进的。
----------------------------------------------
(C)(P)Flying Wang
|
|