
안녕하세요 저는 Python 3.6 및 MySQL 5.5.62에서 Python 커넥터 8.0.13을 사용하고 있습니다. 윈 7에서
내 테이블에 대규모 Blob 데이터를 쓰고 싶습니다. 문제는 Python에서 쿼리가 오류로 인해 서버와 충돌한다는 것입니다.
C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin\mysqld.exe: 메모리 부족(240225944바이트 필요)
그리고
오류: 메모리가 부족합니다. mysqld 또는 다른 프로세스가 사용 가능한 모든 메모리를 사용하는지 확인하십시오. 그렇지 않은 경우 mysqld가 더 많은 메모리를 사용할 수 있도록 'ulimit'를 사용하거나 더 많은 스왑 공간을 추가해야 할 수도 있습니다.
이런 일이 발생하면 내 Ram과 스왑 모두 꽉 찼습니다. 이상한 점은. MySQL Workbench를 사용하면 데이터가 삽입됩니다.
지금까지 내가 한 일은 다음과 같습니다.
innodb_buffer_pool_size
256M으로 인상Max_allowed_packet
2G로- 모든 시간 초과 설정을 최소 600으로 설정합니다(mysql.connector.connect에서도 마찬가지).
Python을 통한 삽입은 다음과 같습니다.
command = 'INSERT into table (col1,Blob, col3,... ) Values(val1, %s, val3) on duplicate key update col1=val1, Blob = %s, col3=val3'
cursor.execute(command, [Blobdata, Blobdata])
위 코드는 약 15-20MB의 데이터에 대해 완벽하게 작동하지만 예를 들어 200MB(위 오류와 같이)의 경우 서버가 종료됩니다.
이 문제를 해결하는 방법을 아시는 분이 계시다면 감사하겠습니다.
답변1
좋아, 시간을 좀 보낸 후에 작동하는 해결책을 찾았습니다.
키워드는 다음과 같습니다.LOAD_FILE()
이 기능은 모든 종류의 파일 형식에서 데이터를 로드할 수 있습니다. 그러나 업로드할 파일은 호스트 서버에 있어야 합니다. (secure_file_priv에 유의하세요).
구문은 다음과 같습니다.
INSERT INTO table (Blobcolumn) VALUES(load_file('full path' ))
적어도 창에서는 슬래시가 앞쪽(/)으로 와야 합니다. 또한 load_file()은 파일이 삽입되지 않은 경우 오류를 발생시키지 않는 것 같습니다.
지금까지 400MB 파일로 문제 없이 테스트했습니다. 또한 일반적인 방법으로 데이터를 선택하고 가져오는 데 문제가 없습니다.
이것은 해결 방법처럼 느껴집니다. 나는 더 나은 솔루션을 위해 여전히 열려 있습니다. 또한 이것이 5.5에서만 존재하는 버그인지, 아니면 최신 버전에서도 여전히 존재하는 버그인지 알고 싶습니다.