我正在导入一个文件夹中的文本文件,每个文件有50,000行,带有一个批处理文件。批处理文件当前按1个文件导入每个文件,但随着时间的推移,速度会减慢很多。但如果我关闭它,再打开它,它又开始得很快,然后随着时间的推移,它变慢了。我想知道是否有人有任何想法来保持速度,以便我可以运行它,而不是经常检查它。
我试过让它在完成导入后删除它导入的文件,但在批量处理方面没有足够的经验来测试它。
FOR %%f IN (*.txt) DO "C:/Program Files/MySQL/MySQL Server 8.0/bin/mysql.exe" -u root --password=passhere -D databasename -e "LOAD DATA INFILE 'D:/Newfolder/dd/%%f' IGNORE INTO TABLE tablename FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n'"发布于 2019-04-18 18:03:40
@echo off
setlocal
set "sqlfile=loadData.sql"
set "folder=D:/Newfolder/dd"
(
set "commit="
echo BEGIN;
for %%f in ("%folder%/*.txt") do (
echo LOAD DATA INFILE '%folder%/%%~nxf' IGNORE INTO TABLE tablename FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n';
set "commit=defined"
)
echo COMMIT;
) > "%sqlfile%"
if defined commit (
"C:/Program Files/MySQL/MySQL Server 8.0/bin/mysql.exe" -u root --password=passhere -D databasename < "%sqlfile%"
)虽然我知道SQLite,但我对MySQL语法知之甚少,所以方法可能是相似的。
您可能会发现,如果您有许多语句要处理,Transactions会更快。
这段代码将使用事务性BEGIN和COMMIT语句创建一个sql文件。事务中的Sql语句将被视为完整的批处理。这意味着数据库将锁定并打开一次,执行sql语句的事务,然后解锁并关闭数据库。
如果没有定义名为sql的变量,那么mysql.exe将不会运行,因为没有任何commit语句被回显到sql文件中。
发布于 2019-04-18 14:12:50
让我们试一试。
@echo off
setlocal enabledelayedexpansion
set "_sqlcmd=C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe"
set cnt=1
for %%i in (*.txt) do (
set id=%%i
call :check
)
:check
for /f "tokens=1,*" %%a in ('tasklist ^| find /I /C "mysql"') do set procs=%%a
if !procs! leq 20 (
if not "!id!"=="%0" "%_sqlcmd" -u root --password=passhere -D databasename -e "LOAD DATA INFILE 'D:\Newfolder\dd\!id!' IGNORE INTO TABLE tablename FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n'"
set /a cnt+=1
) else (
goto check
)
echo del /Q *.txt它将启动9个mysql进程,如果一个(或多个)关闭,它将启动更多进程,直到我们再次达到20个进程。(您可以增加/减少您希望允许的进程计数)这样,您将不会一次启动太多mysql进程,这最终只会消耗所有的内存和CPU。
至于删除部分,你会注意到在文件的末尾的代码行echo del /Q *.txt这将纯粹的删除命令的文件夹中的所有txt文件,只有当脚本完成整个运行,如果你是100%确定要删除的文件后,它完成了,然后只是删除echo从该行,只是非常清楚,如果你删除它,它将删除所有的文件。
https://stackoverflow.com/questions/55738964
复制相似问题