【发布时间】:2018-03-27 14:44:47
【问题描述】:
情况
我从远程数据源获得了大量的 json 文件。我将这些文件组织成一个档案,然后将它们读入数据库。如有必要,存在存档以重建数据库。
json 文件是远程生成的,并定期发送到我的服务器,并且读入过程不断发生。不止一次,我们的服务器在一夜之间或周末断电,这对于数据库加载来说是一个巨大的问题,因为进程停止了,我不知道什么已经加载,什么没有所以我必须回滚到某个先前已知的状态并从存档中重建。
为了解决这个问题,我的主加载器守护程序(用 python 编写)现在使用logging 包来跟踪它已加载的文件。 loader daemon 的基本工作流程是
-
cp要归档的json文件 - `rm' 原创
- 将存档副本插入数据库(其 MariaDB)
- 提交到数据库
- 加载的json文件的日志文件名
我不太担心数据库中的重复,但我不希望出现空白;也就是说,档案中的东西不在数据库中。到目前为止,这种方法似乎可以保证防止任何差距。
对于我的日志记录,它基本上看起来像这样。当守护程序在一组接收到的文件名上启动时,它会检查已经加载到目标数据库的重复文件,然后加载所有非重复文件。可以从我的远程数据源中获取重复项。
def initialize_logs(filenames, destination)
try:
with open("/data/dblogs/{0}.log".format(destination), 'r') as already_used:
seen = set([line.rstrip("\n") for line in already_used])
except FileNotFoundError:
print("Log file for {0} not found. Repair database".format(destination))
quit()
fnamelog = logging.getLogger('filename.log')
fnamelog.setLevel(logging.INFO)
fh = logging.FileHandler("/data/dblogs/{0}.log".format(destination))
fh.setLevel(logging.INFO)
fnamelog.addHandler(fh)
然后,当我处理 jsonfiles 时,我会记录使用添加的每个文件
fnamelog.info(filename)
数据库加载器是并行运行的,所以我最初选择了logging 包,因为它内置了并发保护。有多种数据库;并非每个数据库都从 json 文件中提取所有数据。一些信息较多的数据库时间较短,一般为一到两个月。在这种情况下,在给定数据库中有一个包含所有 json 文件的日志文件是很好的,所以如果我想在上面添加一些,我不必担心那里已经存在什么,日志文件是跟踪。
问题
一年过去了。我一直在获取 json 文件。我现在每月收到大约一百万个文件。每个文件名在处理时的文本记录是笨拙的,但它仍然有效......现在。有多个数据库,但对于最大的数据库,日志文件超过半 GB。我觉得这个日志记录解决方案不会再好用了。
当每个数据库有超过 1000 万个文件名并且还在增加时,python 中有哪些选项可以跟踪哪些文件名已插入数据库?
【问题讨论】:
-
您的文件名是否有顺序和唯一的名称?也许记住最后一个成功导入的文件的名称就足够了?
-
@Kos 它们具有唯一的名称并按时间戳排序。不幸的是,由于来自远程站点的连接问题,它们经常乱序到达;或者根本没有,它们必须手动移动。
-
所以也许您还记得最后一个文件的属性,即该文件和该文件之前的所有文件都已成功导入且没有间隙?更新会有点棘手,但可能就足够了。
标签: python python-3.x logging mariadb