python에서 데이터베이스에서 읽은 파일을 추적하려면 어떻게 해야 합니까?
상황.
원격 데이터 소스에서 많은 json 파일을 얻습니다.이 파일들을 아카이브로 정리한 다음 데이터베이스로 읽습니다.아카이브는 필요한 경우 데이터베이스를 재구축하기 위해 존재합니다.
json 파일은 원격으로 생성되어 정기적으로 서버로 전송되며 읽기 프로세스가 지속적으로 수행됩니다.밤사이 또는 주말에 서버 전원이 끊긴 적이 한두 번이 아닙니다.데이터베이스 로딩에 큰 문제가 있었습니다.프로세스가 정지되어 무엇이 로딩되었는지, 무엇이 로딩되지 않았는지 알 수 없었기 때문에 이전에 알려진 상태로 롤백하여 아카이브를 재구축해야 했습니다.
로더은 """ (python")을 합니다.logging
패키지를 사용하여 로드된 파일을 추적할 수 있습니다.는 "Daemon"입니다.
cp
('json')- 'rm' 오리지널
- 아카이브된 복사본을 데이터베이스에 삽입(MariaDB)
- 데이터베이스에 커밋하다
- 로드된 json 파일의 로그 파일 이름
데이터베이스의 중복은 그다지 염려되지 않지만, 데이터베이스에는 없는 아카이브(archive)에 있는 것은 원하지 않습니다.이 방법은 지금까지 제공되어 왔으며 어떠한 차이도 방지할 수 있는 것으로 보입니다.
제 로그는 기본적으로 다음과 같습니다.수신된 파일 이름 집합에서 데몬을 시작할 때 데몬은 대상 데이터베이스에 이미 로드된 중복을 확인한 다음 중복되지 않은 모든 파일을 로드합니다.원격 데이터 소스에서 중복 데이터를 가져올 수 있습니다.
def initialize_logs(filenames, destination)
try:
with open("/data/dblogs/{0}.log".format(destination), 'r') as already_used:
seen = set([line.rstrip("\n") for line in already_used])
except FileNotFoundError:
print("Log file for {0} not found. Repair database".format(destination))
quit()
fnamelog = logging.getLogger('filename.log')
fnamelog.setLevel(logging.INFO)
fh = logging.FileHandler("/data/dblogs/{0}.log".format(destination))
fh.setLevel(logging.INFO)
fnamelog.addHandler(fh)
그런 다음 json 파일을 처리할 때 추가된 각 파일을 로그로 기록합니다.
fnamelog.info(filename)
v-loader를 했습니다.logging
이치노다양한 데이터베이스가 있지만 모든 데이터베이스가 json 파일에서 모든 데이터를 가져오는 것은 아닙니다.정보가 더 많은 일부 데이터베이스는 시간이 더 짧습니다. 1~2번 하다.이 경우 모든 json 파일이 지정된 데이터베이스에 있는 로그 파일이 있으면 좋기 때문에 추가해도 로그 파일이 추적됩니다.
문제
1년이 지났다.json 파일을 계속 받고 있어요.나는 지금 매달 100만 개 정도의 파일을 받고 있다.에서 처리되는 각 파일 이름의 텍스트 로깅은 서툴지만 여전히 작동합니다.현재로는.여러 개의 데이터베이스가 있지만 가장 큰 데이터베이스의 경우 로그 파일은 0.5GB가 넘습니다.이 로깅 솔루션은 더 이상 잘 작동하지 않을 것 같습니다.
데이터베이스에 삽입된 파일 이름, 데이터베이스당 파일 이름이 1,000만 개 이상일 때, 증가하는 파일 이름을 추적하기 위해 python에서 사용할 수 있는 옵션은 무엇입니까?
한 가지 방법은 텍스트 로그 파일이 아닌 데이터베이스 자체의 테이블에 파일을 기록하는 것입니다.Import 날짜나 파일 이름 등의 컬럼을 추가하면 로그에서 정보를 검색할 때 약간의 유연성을 얻을 수 있을 뿐만 아니라 정기적인 유지보수를 수행할 수도 있습니다(예를 들어 몇 개월이 지난 로그레코드 삭제 등).더 이상 볼 필요가 없습니다.)
텍스트 기반 로그 파일을 계속 사용하기로 결정한 경우 거대한 단일 로그 파일이 생성되지 않도록 로그 파일을 분할하는 것을 고려할 수 있습니다.Apache와 같이 많은 데이터를 기록하는 것을 설치하면 로그 파일을 정기적으로 압축하고 아카이브하기 위해 로그 순환을 자동으로 설정하는 것을 볼 수 있습니다.
어떤 유형의 데이터베이스를 사용하고 있는지 말하지 않지만 일반적인 접근법은 다음과 같습니다.
1) 각 json 파일의 해시를 작성합니다.SHA256은 널리 이용 가능합니다.퍼포먼스에 관심이 있는 경우는, https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed 를 참조해 주세요.
2) 해시 필드를 데이터베이스 상의 하나의 키로 하고 다른 작업을 수행하기 전에 해시 필드를 삽입해 보십시오.레코드가 이미 존재하지 않으면 트랜잭션이 중단됩니다.
프로그램 1:
Foreach file in input directory
INSERT IGNORE into database the MD5 of the file
"mv" the file to the archive directory
프로그램 2는 "Keep-alive" 프로그램입니다.
를 it it it it it it it it it it 운영됩니다.cron
프로그램 1을 시작하려고 하지만 이미 실행 중인 경우에는 시작하지 마십시오.
주의:
- 'mv'와 'cron'은 Unix로 가정합니다.Windows 를 사용하고 있는 경우는, 같은 조작을 실시합니다.
- 'mv'는 원자성이기 때문에 파일은 다른 디렉토리의 어느 쪽인가에 있기 때문에 '처리' 여부를 알 필요가 없습니다.(그런데 데이터베이스 테이블은 왜 가지고 계십니까?)?)
- 그 이후로는
INSERT
그리고.mv
현실적으로 "원자적으로" 이루어질 수 없습니다. 내 계획이 안전한 이유는 다음과 같습니다.IGNORE
. - "실행 중"은 프로그램1 또는 2에서 다양한 방법으로 처리할 수 있습니다.
- md5 를 포함한 테이블에 타임스탬프나 파일명, 또는 그 양쪽 모두를 추가할 수 있습니다.
- 디렉토리에 10K 파일이라도 있는 것은 좋지 않기 때문에, 제가 상상했던 플랫 디렉토리 쌍 이외의 것을 사용하는 것이 좋습니다.
3초마다 약 1개의 파일만 수신됩니다.파일 용량이 크지 않으면 큰 부하가 걸리지 않습니다.그러면 데이터베이스 문제가 아니라 I/O 문제가 됩니다.
저는 제가 숨겨진 '요구사항'을 놓치고 있거나, 아니면 독자 분이 편집증적인 태도를 보이고 있다는 느낌이 듭니다.그 파일들을 어떻게 해야 하는지 잘 모르겠어요.
언급URL : https://stackoverflow.com/questions/49515975/how-to-keep-track-of-the-files-i-read-into-a-database-in-python
'programing' 카테고리의 다른 글
JUnit 테스트는 이클립스에서는 합격하지만 Maven Surefire에서는 불합격 (0) | 2022.11.19 |
---|---|
Android 장치 이름 가져오기 (0) | 2022.11.19 |
mysql 덤프 및 가져오기 속도 향상 (0) | 2022.11.19 |
mysql-maria 개선을 위한 mysqlTurner 팁DB (0) | 2022.11.19 |
원칙 2에서 마지막 삽입 ID를 얻으시겠습니까? (0) | 2022.11.19 |