`updatedb`와`locate`는 어떤 종류의 데이터베이스를 사용합니까?


25

locate의 프로그램 findutils스캔 한 파일 이름과 표시 어떤 일치 이상의 데이터베이스. find마지막 파일 이름 데이터베이스 업데이트 중에 파일이있는 경우 매우 빠른 명령 으로 사용할 수 있습니다 .

오늘날 많은 종류의 데이터베이스가 있습니다.

그렇다면 어떤 종류의 데이터베이스가 updatedb업데이트되고 locate사용됩니까?

감사.


locate가 실제로 BerkelyDB를 사용하는지 여부에 관계없이 조사 할 가치가 있습니다. 매우 오래되고 단순하며 효과적인 디스크 기반 키-값 저장소입니다.
pjc50

@ pjc50하고 싶습니다. 데이터베이스 파일은 어디에 있습니까? 내용을 어떻게 볼 수 있습니까?
Tim


"페이지를 찾을 수 없음"링크는 serverfault.com/questions/454127/…
Tim

"키"와 "값"은 데이터베이스에서 무엇을 나타내는가? Stephen Kitt의 의견 unix.stackexchange.com/questions/379725/…를 올바르게 이해 하면 데이터베이스가 키-값이 아닙니다.
Tim

답변:


29

의 구현은 locate/ updatedb일반적으로 오히려 일반적인 데이터베이스 엔진보다, 자신의 요구 사항에 맞는 특정 데이터베이스를 사용합니다. 각 구현에서 문서화 된 특정 데이터베이스를 찾을 수 있습니다. 예를 들면 다음과 같습니다.

  • GNU findutils'는에 문서화되어 locatedb(5)있으며 파일 목록 일뿐입니다 (특정 압축 알고리즘 사용).
  • mlocate의 문서화되어 mlocate.db(5)있으며 메타 데이터가있는 디렉토리 및 파일 목록으로 간주 될 수도 있습니다.

감사. 특정 요구 사항에 맞는 특정 데이터베이스를 설계하고 구현하는 원칙을 어디서 어떻게 배울 수 있습니까? 나는 독서에 대한 언급을 부탁드립니다.
Tim

11
설계 데이터베이스는 너무 사람들에 대해 배우고, 그 다음 크기 - 대 - 속도 디자인의 장단점에 대해 ... 내가 좋아하는 아마 좋은 일이 될 것입니다 특정 자원 모르겠어요, 설계 데이터 구조로 귀결 진주 프로그래밍 것 이 주제에 대해 생각하는 방식에 대한 좋은 소개 (과도하게 생각하지 않음).
Stephen Kitt

감사. 데이터 구조에 대해 배웠으며 다음 질문은 데이터 구조에서 데이터베이스로 이동하는 참조 및 방법을 찾는 것입니다.
Tim

2
사용되는 데이터베이스는 locate디스크에 저장된 데이터 구조 일 뿐이므로 데이터 구조에서 해당 데이터베이스로 이동하는 것이 비교적 간단합니다. 질문이 제시하는대로 데이터베이스로 이동하는 것은 전적으로 또 다른 것입니다. 그 주제에 관한 책과 코스가 있습니다. MongoDB 또는 PostgreSQL과 같은 데이터베이스 관리 시스템을 설계하고 개발하는 것은 오늘날 컴퓨터 과학 및 소프트웨어 공학에서 특히 어려운 문제가 될 때 특히 어려운 문제 중 하나입니다.
Stephen Kitt

2
나는 지난 몇 년 동안 locatedb & mlocate.db를 사용하여 공정하게 작업했습니다. 원래 dlocate데비안에서 내 프로그램 의 locationb를 생성하는 펄 코드가있었습니다 . 텍스트 파일을 grepping하는 것만으로도 locationb를 검색하는 것보다 몇 배 더 빠르다는 사실을 알게되었으며 요즘 디스크 크기를 고려할 때 파일 크기가 크게 줄어들지 않았습니다. 그래서 나는 grep으로 바꿨다. 또한 mlocate cron 작업 실행 후 mlocate.db를 일반 텍스트로 덤프하는 로컬 cron 작업이 있는데, 로컬 cron qlocate스크립트를 사용하여 검색합니다 . ... 실행보다 훨씬 빠르며 mlocate유용한 추가 옵션이 있습니다.
cas

13

Gnu LibC OBSTACKS 매크로를 사용하여 읽고 쓰는 C 구조체의 플랫 파일 인 것 같습니다.

출처보기

https://github.com/msekletar/mlocate/blob/master/src/updatedb.c#L720

https://github.com/msekletar/mlocate/blob/master/src/locate.c#L413

당신은 비슷한 것을 얻을 수 있습니다

find / -xdev -type f -not -path \*\.git\/\* | gzip -9 > /tmp/files.gz
zgrep file_i_want /tmp/files.gz

2
감사. 마지막에 두 가지 명령은 무엇입니까?
Tim

2
@ 팀 첫 번째 명령은 파일 시스템 (검색되는 find루트 (에서) /다른 파일 시스템 (의 디렉토리로 하강하지 않고) 디렉토리 -xdev), 일반 파일 ( -type fNOT IN) *.git디렉토리 ( -not -path \*\.git\/\*). 출력 ( | gzip -9)을 압축 하여 파일 /tmp/files.gz( > /tmp/files.gz)에 저장합니다 . 다음 줄은 압축 파일 내부의 zgrep파일을 찾고 file_i_want있습니다/tmp/files.gz
piotrekkr

2

내가 아는 한 키 / 값 데몬이없는 데이터베이스 인 Berkeley DB 가 있습니다. 자세한 내용을 보려면 링크를 따르십시오. 위키 백과에서 추출 :

BDB (Berkeley DB)는 키 / 값 데이터를위한 고성능 임베디드 데이터베이스를 제공하기위한 소프트웨어 라이브러리입니다. Berkeley DB는 C ++, C #, Java, Perl, PHP, Python, Ruby, Smalltalk, Tcl 및 기타 여러 프로그래밍 언어에 대한 API 바인딩으로 C로 작성되었습니다. BDB는 임의의 키 / 데이터 쌍을 바이트 배열로 저장하고 단일 키에 대해 여러 데이터 항목을 지원합니다. 버클리 DB는 관계형 데이터베이스가 아닙니다.

RHEL / CentOS에서 데이터베이스의 위치 /var/lib/mlocate/mlocate.db는 다른 배포판에 대해서는 확실하지 않습니다. 이 명령 locate --statistics은 데이터베이스의 위치 및 일부 통계에 대한 정보를 제공합니다 (예).

Database /var/lib/mlocate/mlocate.db:
        16,375 directories
        242,457 files
        11,280,301 bytes in file names
        4,526,116 bytes used to store database

이동 형식의 경우 맨 페이지 헤드입니다.

mlocate 데이터베이스는 파일 헤더로 시작합니다. 매직 번호의 경우 8 바이트 (C 리터럴과 같은 "\ 0mlocate"), 빅 엔디안의 구성 블록 크기의 경우 4 바이트, 파일 형식 버전 (0)의 경우 1 바이트, 1 "가시성 요구"플래그 (0 또는 1)의 바이트, 2 바이트의 패딩 및 데이터베이스 루트의 NUL 종료 경로 이름.

일부 구성 변경 사항이 내용에 영향을 줄 수있는 경우 데이터베이스를 재사용하지 않도록 헤더에 구성 블록이옵니다. 구성 블록의 크기 (바이트)는 파일 헤더에 저장됩니다. 구성 블록은 변수 이름 순서대로 변수 할당 순서입니다. 각 변수 할당은 NUL 종료 변수 이름과 NUL 종료 값의 순서화 된 목록으로 구성됩니다. 값 목록은 하나 이상의 NUL 문자로 종료됩니다. 사용 된 순서는 strcmp () 함수로 정의됩니다.


2
그것은의 구현에 따라 달라집니다 locate/ updatedb...
스티븐 키트를

2
mlocate대부분 버클리 DB를 사용하지 않습니다.
Stephen Kitt

1
BerkeleyDB의 주장을 뒷받침하는 자료가 있습니까? 답변의 두 번째 부분이 이에 반합니다.
Mat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.