{ db_conn.insert_into(convert_line_to_object(line)) }) } 这个实现通过将raw string 放入磁盘,同时利用csv行间隔离的特性。通过流式的方式将数据迁移到本地db中。对于物理内存的需求基本是趋近于O(1)的。从而解决了我们上面提出的两个问题。 那么,这个版本就完美了吗? 从代码逻辑上来看,这个版本对于数据量的限制从内存转移到了磁盘,在实际过程中可以认为解决了数据量代码无法工作的问题。但是它仍然存在一个问题 -- 磁盘IO过于频繁,磁盘IO表现在两个方面: 读取csv 写入sqlite 那么,我们是否有可能再次优化嘞? function parse_data(String filePath): Object[] { let file_lst = CsvUtil.split_file_by_lines(filePath,1000) // per csv file 1000 line let db_conn = Sqlite.open("./cache.db") foreach file_lst as file: Thread.run(()=>{ let lst: Object[]; CsvReader .open(file) .each((line)=>{ lst.append(convert_line_to_object(line)) }) db_conn.batch_insert(lst); }) end wait_all_thread_done() } 基于我们提出的疑问,我们编写了这个版本。这个版本提出了批处理的概念。也就是将一个任务拆分成数个互相独立的子任务,同时引入了多线程来发挥多核优势。 到此,我们就实现了一个多核加速、数据量无上限(假设磁盘无上限)的数据解析器。当然,同时代码复杂度也指数级上。 总结 本文主要目的是利用了一个实际案例,来讨论我们做性能优化的思辨过程: 在优化之前,发现主要矛盾 根据主要矛盾的来推演我们需要的解决方案 寻找解决方案,并且确定该解决方案可以解决问题 根据需要看是否需要继续优化,如果优化就回到#1。">