我使用BigQuery
作为我的数据库与Scrapy
蜘蛛。下面是将数据存储到DB中的两个管道。一个使用Insert
,另一个使用Update方法。Update方法比insert慢70 times
(每分钟仅更新20条记录)。更新需要3.560
秒,而插入只需0.05
秒。我错在哪里,如何加快更新方法?
P.S.当前表的大小大约是20k条记录,潜在的大小可以高达500000条记录。需要每天更新记录。
更新方式
# Define the update query
query = f"""
UPDATE `{self.dataset_id}.{self.table_id}`
SET `Sold Status` = '{data['Sold Status']}',
`Amount of Views` = '{data['Amount of Views']}',
`Amount of Likes` = '{data['Amount of Likes']}',
`Sold Date & Time` = '{data['Sold Date & Time']}'
WHERE `Item number` = '{data['Item number']}'
"""
start_time = time.time()
# Run the update query
job = self.client.query(query)
# Wait for the job to complete
job.result()
# Check if the query was successful
if job.state == 'DONE':
print('Update query executed successfully.')
else:
print('Update query failed.')
end_time = time.time()
execution_time = end_time - start_time
logging.info(execution_time)
return item
插入方式
start_time = time.time()
data = item
slug = data['slug']
if slug in self.ids_seen:
raise DropItem("Duplicate item found: {}".format(slug))
else:
data.pop('slug', None)
self.ids_seen.add(slug)
table_ref = self.client.dataset(self.dataset_id).table(self.table_id)
# Define the rows to be inserted
rows = [
data
]
# Insert rows into the table
errors = self.client.insert_rows_json(table_ref, rows)
if errors == []:
print("Rows inserted successfully.")
else:
print("Encountered errors while inserting rows:", errors)
end_time = time.time()
execution_time = end_time - start_time
logging.info(execution_time)
return item
1条答案
按热度按时间k3bvogb11#
好的。感谢ChatGPT,我找到了解决这个问题的方法。过去需要9个小时的代码现在只需要不到15分钟。所以36倍的改善。
基本上我做的是:
1.创建新的临时表。
1.将所有抓取的数据作为json批量追加到此表
1.从新表到主表运行Update命令(整个过程只需要5秒,而不是每个更新查询需要5秒)。怎么会这样?)
1.截断临时表,让它在几个小时内为下一次使用做好准备(仅供参考,你不能立即使用截断的表。2到15分钟之间的SMTH应该过去,以使table准备好插入。到目前为止,我对结果相当满意,并将坚持这个解决方案一段时间。