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