这样的程序怎么编写?

2016-03-03 23:04:18 +08:00
 billgreen1
背景:
有个耗时比较长的程序,每算一条记录,需要几百毫秒。而我要算几百万条。
数据量不大,整个读到内存也就几十兆。
程序计算的结果,要写到数据库。

问题:
由于各种原因,比如网络状况不好,有时候程序会突然崩溃。怎样能做到当程序崩溃再次运行时,能从崩溃的地方开始运行,不用重头开始计算。
现在的程序是每算出一条,就往数据库里写一条数据。(不是我写的)
比如我算到 50 多万条,程序崩溃了,现在的解决办法是删除数据库里面的数据,重新计算,插入。

我的想法是生成一个待计算的任务列表,每计算 1 万条往数据库里写一次,当成功后把这一万条的任务从任务列表里面删除。中间碰到任何情况,把待计算的任务列表写入文件。
下次就可以读取文件中的任务来计算了。
4393 次点击
所在节点    Python
23 条回复
eliteYang
2016-03-04 15:49:56 +08:00
先把程序会崩溃解决了,然后再考虑其他方案,可以放进消息队列里,或者处理过的放入数据库里。
最重要的是把任务分拆成最小的,然后再处理,就算崩了也知道处理到了哪里
tairan2006
2016-03-04 16:07:26 +08:00
把偏移量记下来不就完了。。

当然用消息队列更好。
konakona
2016-03-04 16:15:33 +08:00
必須聯網運行嗎?不過不管聯網與否,數據庫的依賴是必不可少的。

可以配合 Redis (或類似工具)來做入庫的中間件工作,這樣做的好處是減輕計算程序的依賴性。
程序首次執行,把 100 個(這個量你來定)放在剛好能容納 100 個空間的 Redis ,每處理完一個再插一個。

負責計算的程序可以多線程、多進程嗎?可以準備守護進程一直檢查這個 name 的進程是否還存活,如果掛了可以再開啟。

這樣做的好處是分工明確減輕計算程序的壓力和複雜度。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/260949

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX