我正在将csv文件读入python中的列表。现在大约是100兆。再过几年,这个文件就会变成2-5gigs。我正在对数据做大量的日志计算。100MB文件大约需要1分钟来完成脚本。在脚本处理了大量数据之后,它创建了指向google图表的url,然后在本地下载图表。
我可以继续在2GIG文件上使用Python吗?还是应该将数据移动到数据库中?
最佳答案
我不知道你到底在干什么。但数据库只会改变数据的存储方式。事实上,它可能需要更长的时间,因为大多数合理的数据库可能有约束列和额外的检查处理。在许多情况下,将整个文件放在本地,进行计算要比查询并将其写回数据库(取决于磁盘速度、网络和数据库争用等)效率更高。但在某些情况下,数据库可能会加快速度,特别是因为如果进行索引,很容易得到数据的子集。
不管怎么说,你提到了日志,所以在你疯狂数据库之前,我有以下想法让你看看。不管怎样,我不确定你是否需要从每一个日志中一直记录下载图表,你期望它增长到2 GB,或者最终你预计每天2 GB的流量。
存档——你可以存档旧的日志,比如每隔几个月。将生产日志复制到存档位置并清除实况日志。这将使文件大小保持合理。如果你浪费时间访问文件,找到你需要的小片,那么这将解决你的问题。
您可能需要考虑转换为Java或C。特别是在循环和计算方面,您可能会看到30倍或更多的加速。这可能会立即减少时间。但随着数据的增长,总有一天,这种情况也会放慢。如果你没有数据量的限制,最终即使手工优化汇编的世界上最伟大的程序员也会太慢。但它可能会给你10倍的时间…
您还可能想考虑瓶颈问题(是磁盘访问,是CPU时间),并基于此来制定一个并行执行此任务的方案。如果是处理,查看多线程(最终是多台计算机),如果是磁盘访问,考虑在多台机器之间拆分文件…这取决于您的情况。但我怀疑归档可能会消除这里的需要。
正如你所建议的,如果你一遍又一遍的做同样的计算,那么就把它们存储起来。无论你使用数据库还是文件,这都会给你带来巨大的加速。
如果您正在下载的东西,这是一个瓶颈,查看条件获得使用IF修改的请求。然后只下载更改的项目。如果你只是处理新的图表,那么忽略这个建议。
哦,如果你正在连续读取一个巨大的日志文件,在日志中逐行地寻找一个特定的位置,只需另一个文件存储你工作的最后一个文件位置,然后执行每次查找。
在整个数据库之前,您可能需要考虑sqlite。
最后,“几年”在程序员时代似乎是一段很长的时间。即使只有2个,也会有很多变化。也许你的部门会被解雇。也许你会和你的老板一起走。也许这个系统会被别的东西取代。也许你不再需要做你正在做的事了。如果是6个月我会说修好它。但在几年内,在大多数情况下,我会说,只要使用你现在的解决方案,一旦它变得太慢,然后再做其他事情。你可以在代码中写下你对这个问题的想法,甚至给你的老板发一封电子邮件,这样他也会知道的。但只要它能工作,并且在合理的时间内继续这样做,我现在就认为它已经“完成”了。无论您选择什么解决方案,如果数据变得无限,您将需要重新考虑它。增加更多的机器,更多的磁盘空间,新的算法/系统/开发。解决它的“两年”可能是相当好的。