【原创】Key-Value小数据库tmdb发布 原理和实现

本文介绍了Key-Value小数据库tmdb的发布,它是一个适用于小数据量存储的实验型产品,支持读写操作,但性能在数据量增大后会下降。文章详细讲解了其存储结构、Hash算法以及性能测试结果,并提供了使用示例和源代码链接。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

 

【原创】Key-Value小数据库tmdb发布:原理和实现


Key-Value 数据库是很早起比较典型的老式数据库,从Unix早期的dbm,后来的GNU版本的gdbm,还有ndbm,sdbm, cdb 以及功能强大的Berkeley DB (BDB)、还有这两年风头很劲的qdbm,都是典型代表。实际上来说,Key-Value 数据库不是严格意义上的数据库,只是一个简单快速的数据存储功能。

tmdb 也是差不多这么一个性质Key-Value小数据存储(DBM),设定存储数据目标量级是10W级,性能嘛也不是很好,算是一个小实验型产品。(tmdb 下载)

说说它的基本特点

  • 存储数据量级为10W,超过后性能下降的厉害
  • 因为存储特点决定,更适合存储只读数据,当然,它也是可以删除和修改数据的,只是比较浪费空间
  •  Key长度不能超过64个字节,数据长度不能超过65536个字节,适合存储一些小数据
  • 使用的不是行级锁(Row-Level-Lock),而且是全局锁,所以并发读写情况下,性能不是很好
  • 索引文件和数据文件分离,备份情况下要全部备份
  • 接口API基本是按照传统的dbm的API来设定,整个库文件较小,可直接静态编译进程序

 

简单说说大致的设计思路,设计方案基本是简单容易实现的方式来操作(主要是自己懒),大致说说实现,实现的比较糟糕,请不吝指教。

 


【 存储结构 】

索引使用的是静态索引,Hash表的长度不能动态扩容,缺省是 65535 Hash Bucket,如果冲突的情况使用开拉链法,那么如果冲突厉害,或者数据量大,自然大大增加了查找一条记录的时间,所以小数据量并且Key分布均匀下性能比较好(所有hash都是这样好不好 ^_^)。

上面特点说了,索引和数据文件是分离的,主要是为了动态扩容的时候不用做太多数据迁移和位置计算。

数据存储是单个文件,头部预留了256个字节的剩余,后面的都是用来存数据,所有数据都是 append 的方式,一个数据被删除,只在索引修改标志位,不会做实际数据迁移,也不会做空闲数据空间链表记录(偷懒啊),所以结构比较简单。

看一下索引文件的存储结构:

Index File Struct:
+-----------+----------------------+--------------+----------------+
| Header    |    Key ptr buckets   | Key Record 1 |Key Record 2 .. |
+-----------+----------------------+--------------+----------------+
  256Bytes  262144Bytes(256KB)     76Bytes          76Bytes

 

预留了 256字节的头部空间,用来后续扩展,然后是 256K 的用来存储hash桶到一条Key的指针位置(Key Record),设定的是  65536 * 4 = 256K,所以整个索引文件不能超过2G数据文件,否则单个4字节的指针空间存储不下 (^_^)。
Key Record 是存储一个Key信息的记录,一个Key信息的结构:

 

Index key record
+-------+--------------+----------+----------+
| Flag  |    Key       | Data ptr | Next ptr |
+-------+--------------+----------+----------+
  4Bytes  64Bytes      4Bytes     4Bytes
 
Flag 4个字节是标志是否删除,或者别的。Key 是定长的 64 字节,Data Ptr 是数据指

以下是对tmdb电影榜单数据集进行可视化分析和建立模型进行评分预测的具体代码实现: 1. 数据准备和清洗 ```python # 导入相关库 import pandas as pd import numpy as np # 读取数据集 df = pd.read_csv('tmdb_5000_movies.csv') # 选择需要的特征 features = ['budget', 'genres', 'homepage', 'id', 'keywords', 'original_language', 'original_title', 'overview', 'popularity', 'production_companies', 'production_countries', 'release_date', 'revenue', 'runtime', 'spoken_languages', 'status', 'tagline', 'title', 'vote_average', 'vote_count'] df = df[features] # 进行数据清洗 df = df.dropna() # 删除空值行 df = df[df['status'] == 'Released'] # 只保留已发布的电影 df = df[df['vote_count'] >= 500] # 只保留投票数大于等于500的电影 ``` 2. 可视化分析 ```python # 导入相关库 import matplotlib.pyplot as plt import seaborn as sns # 绘制电影类型分布图 genres = df['genres'].str.split('|', expand=True).stack().value_counts() plt.figure(figsize=(10, 6)) sns.barplot(x=genres.values, y=genres.index, palette='rocket') plt.title('Genres Distribution') plt.xlabel('Count') plt.ylabel('Genres') # 绘制投票人数分布图 plt.figure(figsize=(10, 6)) sns.distplot(df['vote_count'], kde=False, color='g') plt.title('Vote Count Distribution') plt.xlabel('Vote Count') plt.ylabel('Frequency') # 绘制发行年份分布图 df['release_year'] = pd.DatetimeIndex(df['release_date']).year year_counts = df['release_year'].value_counts().sort_index() plt.figure(figsize=(10, 6)) sns.barplot(x=year_counts.index, y=year_counts.values, color='b') plt.title('Release Year Distribution') plt.xlabel('Year') plt.ylabel('Count') ``` 3. 特征工程 ```python # 对电影类型进行独热编码 genres = df['genres'].str.get_dummies('|') df = pd.concat([df, genres], axis=1) # 对发行日期进行时间特征提取 df['year'] = pd.DatetimeIndex(df['release_date']).year df['month'] = pd.DatetimeIndex(df['release_date']).month df['day'] = pd.DatetimeIndex(df['release_date']).day df = df.drop('release_date', axis=1) ``` 4. 建立模型 ```python # 导入相关库 from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score # 分离自变量和因变量 X = df.drop(['vote_average', 'title', 'homepage', 'keywords', 'original_title', 'overview', 'production_companies', 'production_countries', 'spoken_languages', 'status', 'tagline', 'genres'], axis=1) y = df['vote_average'] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 建立线性回归模型 lr = LinearRegression() lr.fit(X_train, y_train) # 预测测试集结果 y_pred = lr.predict(X_test) # 评估模型 r2 = r2_score(y_test, y_pred) print('R-squared: %.2f' % r2) ``` 5. 模型预测 ```python # 对新数据进行评分预测 new_data = pd.DataFrame({'budget': [10000000], 'original_language': ['en'], 'popularity': [10.0], 'revenue': [50000000], 'runtime': [120], 'year': [2020], 'month': [1], 'day': [1], 'Action': [0], 'Adventure': [1], 'Animation': [0], 'Comedy': [0], 'Crime': [0], 'Documentary': [0], 'Drama': [0], 'Family': [0], 'Fantasy': [0], 'Foreign': [0], 'History': [0], 'Horror': [0], 'Music': [0], 'Mystery': [0], 'Romance': [0], 'Science Fiction': [0], 'TV Movie': [0], 'Thriller': [0], 'War': [0], 'Western': [0]}) y_pred_new = lr.predict(new_data) print('Predicted Vote Average:', y_pred_new[0]) ``` 通过以上代码实现,可以对tmdb电影榜单数据集进行可视化分析和建立模型进行评分预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值