PostgreSQL导入4GB SQL文件报内存不足错误的解决咨询
解决PostgreSQL导入大SQL文件时的"out of memory"行缓冲区错误
问题原因
你遇到的错误是因为4GB SQL文件里存在单条超级长的INSERT语句——所有数据都挤在同一个VALUES子句里。psql客户端需要把整行SQL加载到内存解析,直接超出了它的行缓冲区上限,导致内存溢出。
解决方法
1. 重构SQL文件,拆分INSERT语句(根本解决)
别把所有数据塞进同一个INSERT,改成每1000-10000条数据生成一个独立的INSERT语句,甚至每条数据对应一个INSERT(速度稍慢但内存压力极小)。
如果是Python生成的SQL,修改生成逻辑:维护一个计数器,累计到指定数量就输出完整INSERT,然后重置。示例代码片段:
# 假设data是你的原始数据列表 batch_size = 1000 with open("C:\\file.sql", "w", encoding="utf-8") as f: # 先写入建表语句 f.write("""CREATE TABLE test1 ( idcustomer int NOT NULL, testid varchar(250) DEFAULT NULL, customername varchar(250) DEFAULT NULL, custlastname varchar(250) DEFAULT NULL, birthid varchar(250) DEFAULT NULL, name varchar(250) DEFAULT NULL, namee varchar(250) DEFAULT NULL, named varchar(250) DEFAULT NULL, phonenumber varchar(250) DEFAULT NULL, testname varchar(250) DEFAULT NULL, testnumber varchar(250) DEFAULT NULL, testnamee varchar(250) DEFAULT NULL );\n\n""") # 分批生成INSERT语句 for i in range(0, len(data), batch_size): batch = data[i:i+batch_size] # 生成VALUES部分,注意转义单引号 values = ",\n".join([ f"({row['idcustomer']}, '{row['testid'].replace('''', '''''')}', '{row['customername'].replace('''', '''''')}', '{row['custlastname'].replace('''', '''''')}', '{row['birthid'].replace('''', '''''')}', '{row['name'].replace('''', '''''')}', '{row['namee'].replace('''', '''''')}', '{row['named'].replace('''', '''''')}', '{row['phonenumber'].replace('''', '''''')}', '{row['testname'].replace('''', '''''')}', '{row['testnumber'].replace('''', '''''')}', '{row['testnamee'].replace('''', '''''')}'" for row in batch ]) f.write(f"INSERT INTO test1 (idcustomer, testid, customername, custlastname, birthid, name, namee, named, phonenumber, testname, testnumber, testnamee) VALUES\n{values};\n\n")
注意:必须处理字符串中的单引号(把
'替换成''),否则会触发SQL语法错误。
2. 拆分现有超长SQL文件(应急方案)
如果不想重新生成SQL,用系统工具拆分超长的INSERT行:
- Linux/macOS用
split命令按行数拆分(比如每1000个值行拆一个文件):
split -l 1000 C:\file.sql split_file_
- Windows可以用PowerShell或者第三方文本拆分工具,拆分后手动补全每个文件的INSERT开头和结尾,再逐个导入。
3. 用\copy导入CSV(更高效)
如果能把原始数据转成CSV格式,用PostgreSQL的\copy命令导入是最优解——速度快、内存占用极低:
- 先让Python直接生成CSV文件(避免SQL转义问题)
- 执行导入命令:
psql -h localhost -U postgres -d test -c "\copy test1 FROM 'C:\file.csv' WITH (FORMAT csv, HEADER true, DELIMITER ',', QUOTE '"');"
验证
修改后打开SQL文件,确认没有超长单行INSERT,再重新执行原导入命令:
psql -h localhost -U postgres -d test -f C:\file.sql
内容的提问来源于stack exchange,提问作者ADAM
相关产品推荐
相关产品推荐

