存在一个Postgress数据库表,其中包含大约400万行产品信息。可用列为产品id、SKU
、产品条形码(array field
(&在这里,用户将上传产品数据的CSV
文件。每个产品可能包含多个条形码。数据将根据数据库中现有的产品条形码进行更新。如果条形码已经存在,则会跳过CSV
文件中的产品行,或者不会从CSV
添加产品。否则,将添加一个包含产品信息的新行,并创建一个任务以手动验证插入的产品。这些验证过程由管理员手动完成。因此,在向表中插入数据之前,我必须检查每一行,因为有大量数据,所以查询时间非常长。条形码列已编入索引。
我用来检查条形码是否存在的查询:
SELECT * FROM retail_retailinventory WHERE ARRAY['*****'] <@ barcodes
然而,如果找不到任何匹配,我必须触发5次插入到不同的模型,如Inventory、PosModel和Task模型。所有这些都是依赖的。因此,必须同步触发此操作。我尝试过使用bulk_create,但由于必须维护模型之间的外键关系,所以还不能成功。这个插入过程填充了大部分内存,并发生超时。
有什么方法可以优化流程吗?或者在这种情况下应用机器学习的范围是什么?我担心的是,如果我应用ML,每次将新行插入数据库时都需要对机器进行训练,这不是一个好的解决方案。
如有任何建议,我们将不胜感激。
谢谢。
如果运行此操作的进程的内存不是问题,则可以执行以下操作:
from itertools import chain
existing_barcodes = set(chain.from_iterable(RetailInventory.objects.all().values_list('barcodes', flat=True)))
while csv_processing:
line = # next csv line
if line['barcode'] in existing_barcodes:
continue
理想情况下,您可以将初始获取限制为仅相关产品。所以可能会在CSV上迭代两次?第一个是获取产品和条形码,这样您就可以在单个查询中看到哪些实际上是新的,然后第二个是处理它们。
您可以创建索引:
create index on retail_retailinventory using GIN (barcodes)
然后将WHERE子句重写为:
WHERE ARRAY['*****'] <@ barcodes