Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何跟踪我在python中读入数据库的文件? 处境_Python_Python 3.x_Logging_Mariadb - Fatal编程技术网

如何跟踪我在python中读入数据库的文件? 处境

如何跟踪我在python中读入数据库的文件? 处境,python,python-3.x,logging,mariadb,Python,Python 3.x,Logging,Mariadb,我从远程数据源获取了大量json文件。我将这些文件组织成一个归档文件,然后将它们读入数据库。如果需要,存在用于重建数据库的存档 json文件是远程生成的,并定期发送到我的服务器,读取过程持续进行。不止一次,我们的服务器在一夜之间或周末断电,这对数据库加载来说是一个巨大的问题,因为进程停止了,我不知道加载了什么,也不知道加载了什么,所以我不得不回滚到以前已知的状态,并从归档中重建 为了解决这个问题,我的主加载程序守护程序(用python编写)现在使用日志记录包来跟踪它加载了哪些文件。加载程序守护程

我从远程数据源获取了大量json文件。我将这些文件组织成一个归档文件,然后将它们读入数据库。如果需要,存在用于重建数据库的存档

json文件是远程生成的,并定期发送到我的服务器,读取过程持续进行。不止一次,我们的服务器在一夜之间或周末断电,这对数据库加载来说是一个巨大的问题,因为进程停止了,我不知道加载了什么,也不知道加载了什么,所以我不得不回滚到以前已知的状态,并从归档中重建

为了解决这个问题,我的主加载程序守护程序(用python编写)现在使用
日志记录
包来跟踪它加载了哪些文件。加载程序守护程序的基本工作流是

  • cp
    json要归档的文件
  • `rm'原件
  • 将存档副本插入数据库(其副本)
  • 提交到数据库
  • 加载的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)
然后,在处理JSonfile时,我使用

fnamelog.info(filename)
数据库加载器是并行运行的,因此我最初选择了
日志记录
包作为其内置的并发保护。有各种各样的数据库;并非每个数据库都从json文件中提取所有数据。一些信息较多的数据库的时间较短,通常为一到两个月。在本例中,在给定的数据库中有一个包含所有json文件的日志文件是很好的,因此如果我想在其中添加一些,我不必担心其中已经包含了什么,日志文件正在跟踪


问题 一年过去了。我一直在获取json文件。我现在每月收到大约一百万个文件。在中处理每个文件名时,对其进行文本记录是很笨拙的,但目前它仍然可以工作。有多个数据库,但对于最大的数据库,日志文件超过半GB。我觉得这个日志解决方案在很长时间内都无法正常工作


当每个数据库有超过1000万个文件名时,python中有哪些选项可用于跟踪哪些文件名已插入到数据库中,并且不断增加?

一种方法是将文件记录在数据库本身的表中,而不是记录在文本日志文件中。如果您为导入日期或文件名之类的内容添加了一些列,那么在需要时从这些日志中查找信息时,这可能会为您提供一些灵活性,但也允许您执行定期维护(例如,如果您知道不需要查看那些日志记录,则可以删除超过几个月的日志记录)


如果你决定继续使用基于文本的日志文件,你可能会考虑分解它们,这样你就不会遇到一个巨大的整体日志文件。当你安装诸如Apache之类的日志记录很多数据时,你会看到它自动设置来定期压缩和归档日志文件。

< p>你不说你使用的是哪种类型的数据库,而是采取的一般方法是

1) 对每个json文件进行散列。SHA256可广泛使用。如果您关心性能,请参阅本文

2) 使哈希字段成为数据库上的唯一键,在执行其他操作之前,请尝试插入它。如果无法确定,记录已经存在,事务将中止程序1:

Foreach file in input directory
    INSERT IGNORE into database the MD5 of the file
    "mv" the file to the archive directory
程序2,一个“保持活力”的程序

它每分钟都通过
cron
运行,并尝试启动程序1,但如果程序1已经在运行,则不要启动它

注:

  • “mv”和“cron”假定为Unix。如果使用Windows,请执行同等操作
  • “mv”是原子的,因此该文件将位于另一个目录的其中一个目录中;不需要知道它是否已“处理”。(所以,我想知道为什么您甚至有一个数据库表??)
  • 由于插入
    mv
    实际上无法“原子化”完成,因此我的计划是安全的:
    忽略
  • 在程序1或程序2中,可以通过多种方式处理“是否正在运行”
  • 您可以向包含md5的表中添加时间戳和/或文件名;你喜欢什么都行
  • 因为在一个目录中甚至有10K文件都不是一个好主意,所以您应该使用我所设想的一对平面目录以外的其他目录
您每3秒仅获得1个文件。这不是一个沉重的负担,除非文件是巨大的。然后它就变成了一个I/O问题,而不是数据库问题


我有一种感觉,要么我错过了一个隐藏的“要求”,要么你变得特别偏执。我真的不明白您需要如何处理这些文件。

您的文件名是否有顺序和唯一的名称?也许记住最后一个成功导入的文件的名称就足够了?@Kos它们有唯一的名称,并按时间戳排序。不幸的是,由于来自远程站点的连接问题,它们经常出现故障;或者根本没有,它们必须手动移动。因此,您可能还记得最后一个文件的属性,即此文件和此文件之前的所有文件都已成功导入,没有间隙?更新会有点棘手,但可能已经足够了。问题中的一个部分似乎格式不正确。我仔细考虑了一下,这个独特的关键思想有一些优点。有什么原因吗