gpt4 book ai didi

python - 在python中使用MySQLdb向数据库插入新元素时发生内存泄漏

转载 作者:行者123 更新时间:2023-11-29 03:29:16 24 4
gpt4 key购买 nike

我有一个包含图像列表的文件夹,我从中创建每个图像的哈希值,并使用 Python 中的 MySQLdb 将它一张一张地插入到 SQL 数据库中。该文件夹中大约有 1400 张图像,我需要将其哈希值存储在该数据库中。但是,每次插入时,它都会占用我的一部分可用 RAM,最终以 0 个可用 RAM 空间告终,并且进程被终止。我不明白为什么会这样,因为一个简单的插入不应该导致将整个数据库放入 RAM 中。因此,执行插入时消耗的 RAM 量不应取决于数据库的大小。然而,即使我在每次插入后都在执行 self.db.close() ,但我的 RAM 已经被时间填满了。为什么会发生这种情况,我该如何解决?

代码如下:

def create_hash(userpath, hashfunc=imagehash.phash):
print "here"
image_filenames = [os.path.join(userpath, path)
for path in os.listdir(userpath) if is_image(path)]
for img in sorted(image_filenames):
try:
hash_img = hashfunc(Image.open(img))
img_url = img.split("/")[-1]
print hash_img
c = Connection()
c.insert(img_url, hash_img)
c.close_connection()
except Exception,e:
print str(e)

这里是连接类的插入函数:

class Connection():
def __init__(self):
self.db = MySQLdb.connect("localhost","root","password","some_schema")
self.cursor = self.db.cursor()

def insert(self, image_url, hash_value):
query = "insert into image_hash (image_url, hash) value (\"%s\",\"%s\")"%(image_url, hash_value)
print query
try:
self.cursor.execute(query)
self.db.commit()
except Exception,e:
self.db.rollback()
print str(e)
def close_connection(self):
self.db.close()

请注意我使用的是this imagehash python library在我上面的代码中

最佳答案

尝试在一个查询中插入多行。

INSERT statements that use VALUES syntax can insert multiple rows. To do this, include multiple lists of column values, each enclosed within parentheses and separated by commas.

看看内存是否仍在泄漏。

class Connection():
def __init__(self):
self.db = MySQLdb.connect("localhost","root","password","some_schema")
self.cursor = self.db.cursor()

def insert(self, values):
query = "insert into image_hash (image_url, hash) values {0}".format(values)
try:
self.cursor.execute(query)
self.db.commit()
except Exception,e:
self.db.rollback()
print str(e)

def close_connection(self):
self.db.close()


def create_hash(userpath, hashfunc=imagehash.phash):
_join = os.path.join
image_filenames = [_join(userpath, path)
for path in os.listdir(userpath) if is_image(path)]
hash_list = []
for img in sorted(image_filenames):
try:
hash_img = hashfunc(Image.open(img))
img_url = img.split("/")[-1]
hash_list.append("('{0}', '{1}')".format(img_url, hash_img))
except Exception,e:
print str(e)


c = Connection()
c.insert(', '.join(hash_list))
c.close_connection()

关于python - 在python中使用MySQLdb向数据库插入新元素时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32565318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com