import pandas as pd import numpy as np # pymysql接口 def mysql_conn(host, user, password, db, port=3306, charset="utf8"): conn = pymysql.connect(host=host, user=user, password=password, database=db, port=port, charset=charset) return conn # 当前脚本的位置 current_folder_path = os.path.dirname(__file__) # 你的文件的位置 your_file_path1 = os.path.join(current_folder_path, "文件的名字1") your_file_path2 = os.path.join(current_folder_path, "文件的名字2") # 我这里是以读取csv文件为例, delimiter为我们内部约定的列之间的分割符 df1 = pd.read_csv(your_file_path1, dtype={"column1": str, "column2": str}, delimiter="/t") df2 = pd.read_csv(your_file_path2, dtype={"column1": str, "column2": str}, delimiter="/t") # 合并 ret_df = pd.merge(df1, df2, left_on=["column_name"], right_on=["column_name"], how="left") # 先创建cursor负责操作conn接口 conn = mysql_conn("your db host", "your username", "your password", "db name") cursor = conn.cursor() # 开启事务 conn.begin() # 先构造需要的或是和数据库相匹配的列 columns = list(df.columns) # 可以删除不要的列或者数据库没有的列名 columns.remove("列名") # 重新构造df,用上面的columns,到这里你要保证你所有列都要准备往数据库写入了 new_df = df[columns].copy() # 构造符合sql语句的列,因为sql语句是带有逗号分隔的,(这个对应上面的sql语句的(column1, column2, column3)) columns = ','.join(list(new_df.columns)) # 构造每个列对应的数据,对应于上面的((value1, value2, value3)) data_list = [tuple(i) for i in gdsord_df.values] # 每个元组都是一条数据,根据df行数生成多少元组数据 # 计算一行有多少value值需要用字符串占位 s_count = len(data_list[0]) * "%s," # 构造sql语句 insert_sql = "insert into " + "数据库表名" + " (" + columns + ") values (" + s_count[:-1] + ")" try: cursor.executemany(insert_sql, data_list) conn.commit() cursor.close() conn.close() except Exception as e: # 万一失败了,要进行回滚操作 conn.rollback() cursor.close() conn.close()
完整代码
如果没问题的话,就可以同时进行多个文件读写,计算,最后启用多线程同时向数据库中写入数据了,非常高效!
cursor.executemany(insert_sql, data_list) conn.commit() cursor.close() conn.close()
这个简单,直接上代码
# 先创建cursor负责操作conn接口 conn = mysql_conn("your db host", "your username", "your password", "db name") cursor = conn.cursor() # 开启事务 conn.begin() ############# 构造批量数据的过程 ############# # 先构造需要的或是和数据库相匹配的列 columns = list(df.columns) # 可以删除不要的列或者数据库没有的列名 columns.remove("列名") # 重新构造df,用上面的columns,到这里你要保证你所有列都要准备往数据库写入了 new_df = df[columns].copy() # 构造符合sql语句的列,因为sql语句是带有逗号分隔的,(这个对应上面的sql语句的(column1, column2, column3)) columns = ','.join(list(new_df.columns)) # 构造每个列对应的数据,对应于上面的((value1, value2, value3)) data_list = [tuple(i) for i in gdsord_df.values] # 每个元组都是一条数据,根据df行数生成多少元组数据 # 计算一行有多少value值需要用字符串占位 s_count = len(data_list[0]) * "%s," # 构造sql语句 insert_sql = "insert into " + "数据库表名" + " (" + columns + ") values (" + s_count[:-1] + ")"
具体实现如下
1.类似这种: Insert into table_name (column) values (value);
2.executemany(批量插入语句)
1.数据插入要考虑写入一个事务,因为失败的话,要保证对数据库没有影响
2.构造符合对应接口的数据格式,通过查询,pymysql有两种可以执行语句的接口
# pymysql的接口获取链接 def mysql_conn(host, user, password, db, port=3306, charset="utf8"): # 传参版本 conn = pymysql.connect(host=host, user=user, password=password, database=db, port=port, charset=charset) return conn
导入三方库pymysql,初始化连接
# 这里以左连接举例, 假设只有两个文件拼接 ret_df = pd.merge(df1, df2, left_on=["column_name"], right_on=["column_name"], how="left")
文件的拼接主要就是merge和concat两个语法的使用,强调一下小知识点
import pandas as pd import numpy as np # 当前脚本的位置 current_folder_path = os.path.dirname(__file__) # 你的文件的位置 your_file_path1 = os.path.join(current_folder_path, "文件的名字1") your_file_path2 = os.path.join(current_folder_path, "文件的名字2") # 我这里是以读取csv文件为例, delimiter为我们内部约定的列之间的分割符 df1 = pd.read_csv(your_file_path1, dtype={"column1": str, "column2": str}, delimiter="/t") df2 = pd.read_csv(your_file_path2, dtype={"column1": str, "column2": str}, delimiter="/t")
给文件路径,然后去读文件就行了,强调一下需要注意的点
实际上,最后一步,要写入数据库的文件数据是存储在内存中的。因为读取文件后进行的计算都是在内存中进行的,那么计算的结果也没必要再写到本地,再去读取,再写入数据库,这是会影响程序的效率的。逻辑如下
最近在处理一个需求,有关批量往数据库插入数据的,描述如下
本文基于python, 使用pandas, pymysql等三方库实现了向数据库中高效批量插入数据,一方面提供被网上很多瞎转载的答案给坑蒙了的人(因为我也是),一方面自己也做个笔记,以后方便查阅.
Android是目前全球最流行的操作系统之一,它为用户提供了许多功能和应用程序。然而,在使用Android应用程序时,用户可能会遇到卡顿和崩溃等问题。这些问题的主要原因是应用程序的性能不佳。
因此,如何优化Android应用程序的性能成为了一个非常重要的问题。以下是一些可以帮助您提高Android应用程序性能的技巧。
减少应用程序的内存占用
在开发Android应用程序时,应该尽可能减少应用程序对内存的占用。如果应用程序占用过多的内存,系统可能会强制关闭它,从而导致崩溃。为了避免这种情况,您可以尽可能使用轻量级的库,并避免在应用程序中使用过多的图片和动画。
缓存数据
当应用程序需要频繁访问网络或文件系统时,可以使用缓存来减少访问时间和提高性能。缓存可以在内存或磁盘上存储数据,并在需要时快速检索。Android提供了多种缓存技术,包括SharedPreferences,SQLite数据库和内存缓存。
使用异步任务
当应用程序需要执行长时间运行的操作时,例如下载文件或从网络获取数据,应该使用异步任务。异步任务可以在后台运行,不会阻塞主线程,并在完成任务后将结果传递回UI线程。这可以提高应用程序的性能并减少卡顿。
减少UI层次结构
应用程序的UI层次结构应该尽可能简单,以减少布局和渲染时间。如果UI层次结构过于复杂,会导致应用程序响应变慢,从而影响用户体验。为了避免这种情况,您可以使用Android提供的自定义视图来简化UI层次结构。
使用内存分析工具
当应用程序出现性能问题时,可以使用内存分析工具来帮助您找出问题的根本原因。内存分析工具可以帮助您确定应用程序占用的内存量,以及哪些对象正在占用大量内存。根据分析结果,您可以优化应用程序的代码,以减少内存占用并提高性能。
通过实施以上技巧,您可以有效地提高Android应用程序的性能。优化应用程序的性能不仅可以提高用户体验,还可以增加应用程序的下载量和用户留存率。