python操作数据库读写

最近遇到一个需求,需要生成百万级以上的随机数,进行大量的读取和运算,显然放入内存可能随着程序的处理,导致内存爆掉,由于改使用贯穿程序始终,

很难使用del 或者gc.collect()进行内存释放

为了提高整个程序的运算性能,考虑使用sqlite3数据库

以下给出示例代码

# -*- coding:utf-8 -*-
"""
作者: 禅主
时间: 2023/11/9 14:44
"""

import os
import random
import sqlite3


def create_random_numbers_db(num_records):
    db_exists = os.path.exists('random_numbers.db')

    # 连接到SQLite数据库(如果不存在则会创建)
    conn = sqlite3.connect('random_numbers.db')
    cursor = conn.cursor()

    if db_exists:
    	# 这里增加清空数据表,是因为我在实际使用的时候可能存在多次创建使用该数据库的场景
    	# 在使用前,将之前使用过的数据进行清空
        # 清空已存在的表格数据
        cursor.execute('DELETE FROM small_random')
        cursor.execute('DELETE FROM decimal_numbers')
        cursor.execute('DELETE FROM hex_numbers')
        cursor.execute('DELETE FROM hex_large_numbers')

        # Commit the changes
        conn.commit()
        # Close the connection and re-open
        conn.close()
        # Reconnect to the database
        conn = sqlite3.connect('random_numbers.db')  # Replace with the actual database file
        # Create a cursor
        cursor = conn.cursor()
        cursor.execute('VACUUM')  # 释放空间
    else:
        # 创建4个表格用于存储不同类型的随机数
        for table_name in ['small_random', 'decimal_numbers', 'hex_numbers', 'hex_large_numbers']:
            cursor.execute(f'''
                CREATE TABLE IF NOT EXISTS {table_name} (
                    id INTEGER PRIMARY KEY,
                    value TEXT
                )
            ''')

    # 生成并插入指定数量的随机数
    for _ in range(num_records):
    	# 创建范围为1000-9999的随机数
        small_random = random.randint(1000, 9999)
        # 创建长度为8位的十进制随机数
        decimal_random = random.randint(10000000, 99999999)
        # 创建长度为8位的十六进制随机数
        hex_random = format(random.randint(0, 0xFFFFFFFF), 'x').zfill(8).upper()
        # 创建长度为32位的十六进制随机数
        hex_large_random = format(random.getrandbits(128), 'x').zfill(32).upper()
		# 写入数据库
        cursor.execute('INSERT INTO small_random (value) VALUES (?)', (str(small_random),))
        cursor.execute('INSERT INTO decimal_numbers (value) VALUES (?)', (str(decimal_random),))
        cursor.execute('INSERT INTO hex_numbers (value) VALUES (?)', (hex_random,))
        cursor.execute('INSERT INTO hex_large_numbers (value) VALUES (?)', (hex_large_random,))

    conn.commit()
    conn.close()


def get_value_at_index(table_name, index):
    # 这里使用index+1,是因为我需要在一个for循环中配合其他数据处理调用读取函数,index可能会被传入0,
    # 而数据库中的数据,默认是从1开始的,此处需要注意
    index += 1
    # 连接到SQLite数据库
    conn = sqlite3.connect('random_numbers.db')
    cursor = conn.cursor()

    # 根据表格名和索引获取对应的值
    cursor.execute(f'SELECT value FROM {table_name} WHERE id = ?', (index,))
    value = cursor.fetchone()

    conn.close()

    return value[0] if value else None


if __name__ == '__main__':
    # 调用函数来创建并填充数据库,创建1,000,000数据
    nums = 1000000
    create_random_numbers_db(nums)
    # 读取
    for i in range(100):
        a = str(get_value_at_index('small_random', i))
        print(a)
        a = str(get_value_at_index('decimal_numbers', i))
        print(a)
        a = str(get_value_at_index('hex_numbers', i))
        print(a)
        a = str(get_value_at_index('hex_large_numbers', i))
        print(a)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值