|
|
最近在折腾易语言做日志分析,踩了两个典型坑:大文件读写性能和编码混乱。网上的教程大多停留在“小文件一口吞”的年代,真到几百 MB、几个 GB 的日志,才发现内存爆了、界面卡死、中文变问号。这里把我这阵子的实战体会梳理一下,给后来者省点时间。
先说读大文件。易语言自带的“读入文件”一把梭,碰上大文件是灾难:一次性分配内存、无进度反馈、GC 压力暴增。更稳妥的做法是“分块顺序读取”:开文件句柄,指定合理的缓冲区(我用过 256KB 到 1MB),循环 ReadFile 到字节数组,再在内存里处理。这样有几个好处:内存占用可控、可以随时中断、还能做进度条。注意两点细节:一是块边界可能截断一行文本,必须把上个块的“尾巴”缓存起来和下个块拼接再按换行符切分;二是如果你做关键词统计,尽量边读边统计,别把所有行攒成数组,那是给自己挖坑。
写大文件同理,避免频繁小写。把加工后的数据先写入内存缓冲,达到阈值(比如 512KB)再 flush 到磁盘,会明显减少系统调用次数。日志追加模式要记得用文件指针 Seek 到尾部,别每次都先读后写。还有一个冷门但很实用的点:Windows 上开启顺序写入提示(FILE_FLAG_SEQUENTIAL_SCAN 类似语义)能让系统优化缓存命中,顺序场景里体感会快不少。
再聊编码,这恐怕是大家吐槽最多的地方。实际项目里,来源文件五花八门:ANSI(实为某种本地代码页)、UTF-8、UTF-8 with BOM、UTF-16 LE/BE 全都有。要想少出错,第一步是“探测而非猜测”。做法很简单:先读前几个 KB,优先检查 BOM;没 BOM 再做启 |
|