我只是想通过使用 supercsv 编写从 mysql db 获取到 CSV 的大量数据。我可以多么简单地管理性能问题。超级 csv 写有一些限制吗?
1 回答
由于您在问题中几乎没有详细说明您是如何解决问题的,因此很难提出具体的建议。所以,这是一个通用的:
除非您将文件写入非常慢的介质(一些旧的 U 盘或其他东西),否则过程中最慢的步骤应该是从数据库中读取数据。
构建程序的一般方法有两种:
- 不好的方法:首先将数据库中的所有数据读取到应用程序的内存中,然后在第二步中将所有数据一次性写入 csv 文件。
- 正确的方法:将数据库中的数据“流式传输”到 csv 文件中,即将数据写入应用程序时的 csv 文件(逐条记录或逐批记录)。
这个想法是建立通常称为“管道”的东西。可以把它想象成工厂中的传送带结构:在组装某些小部件的过程中有多个步骤。你不想做的是让站 1 处理所有小部件,同时让站 2 和站 3 处于空闲状态,然后将整个小部件容器传递给站 2 开始工作,而站 1 和站 3 处于空闲状态,依此类推. 相反,站 1 需要立即将完成的小批量(一次 1 个或一次 10 个左右)发送到站 2,以便他们可以尽快开始处理它。目标是让所有车站在任何时候都尽可能忙碌。
在您的示例中,站 1 是 mysql 检索记录,站 2 是转发(和处理?)它们的应用程序,站 3 是 supercsv。因此,只需确保 supercsv 可以尽快开始工作,而不必等待 mysql 完成整个请求。
如果你做对了,你应该能够像 mysql 向你抛出记录一样快地生成 csv 文件*,然后,如果它仍然太慢,你需要重新考虑你的数据库后端。
*我还没有使用 supercsv,所以我不知道它的性能如何,但考虑到它的工作是多么的琐碎和它有多受欢迎,我很难相信它最终会表现得不太好(如在此任务中测量一条记录所需的处理时间)比mysql。但这可能是值得验证的东西......