我有一个数据库(SQLite或MySQL),在过去几年中每天都有降雨量值。这很简单:
date | rain
------------------------
"2014-10-20" 3.3
每天,我从当地气象局提取CSV文件。他们只发布包含全年数据的CSV文件,没有每日/每周/等等文件,因此到今年年底,文件中有365行。在每一行中,日期分为年,月和日字段。
因此,当需要将信息存储在数据库中时,我有两个选择。
我会在数据库或文本文件中保存上次运行程序的日期。我使用Date.strptime
解析该日期并将其存储为last_run_time
。然后我用CSV.read('raindata.csv').each do |row|
加载CSV文件,对于每一行,我将三个日期字段解析为rowdate = Date.strptime("#row[2]}-#{row[3]}-#{row[4]}")
的新Date对象,并说if rowdate > last_run_time then
将信息插入数据库。
这样,我就避免对我已有的插入或替换值进行数据库调用。到今年年底,这使我省了364个数据库查询,但这意味着我做了很多日期解析和比较。
我会避免所有这些,只需对CSV中的每一行说出,插入或忽略到数据库中。数据库中的日期字段是唯一的,因此如果我尝试插入但已经有日期,则只会忽略查询。 Pro:避免进行日期比较和解析,con:对数据库进行多达364次不必要的点击。
这两种解决方案中哪一种更智能,更高效,更加资源友好?是否更好地进行不必要的数据库查询并节省CPU,或者副verca?
答案 0 :(得分:-1)
数据库句柄是最重的操作,无论哪种解决方案具有较少的查询次数都是最佳方法。
解析和语言功能的复杂性要小得多..因此语言和较少查询的过程输入
答案 1 :(得分:-1)
与比较日期相比,点击数据库可能会扩展1,000或1,000,000倍。话虽如此,但没有区别,因为对于任何实际目的而言,每天对数据库进行364次点击被视为零负载。
如果您需要更新脚本尽快运行,请进行日期比较。你冒的是会有一些错误的风险,将来可能会错过一些数据。
如果您有额外的几秒钟,并且您最关心数据完整性和简单性,请每天更新整个事情。