2009-04-01 5 views
1

코딩 연습이었던 anagram generator를 생성하고 633,000 줄 (한 줄에 하나의 단어) 정도되는 단어 목록을 사용합니다. 루비에서 작성한 프로그램을 원래 작성 했으므로 온라인으로 배포하려면이 프로그램을 수정하고 싶습니다.파일을 텍스트로 유지하거나 데이터베이스로 가져와야합니까?

내 호스팅 서비스는 Ruby 기반 솔루션에 관해서 만 Ruby on Rails를 지원합니다. 나는 내 자신의 컴퓨터에서 호스팅하고 작은 프레임 워크를 사용한다고 생각했지만 현재이 보안 문제를 다루고 싶지 않습니다.

저는 데이터베이스 기반 (CRUD) 응용 프로그램에만 RoR을 사용했습니다. 그러나, 나는이 방법으로 sqlite 데이터베이스를 채워 본 적이 없다. 그래서 이것은 두 부분으로 된 질문이다 :

1) 이것을 데이터베이스로 가져와야할까요? 그렇다면 가장 좋은 방법은 무엇입니까? 그 경우에는 sqlite를 사용하여 간단하게 유지하고 싶습니다.

2) '플랫 파일'이 더 좋습니까? 나는 단어의 목록을 대조하는 것만으로 작성이나 업데이트를하지 않을 것이다.

감사합니다.

+0

조금 더 많은 정보가 도움이 될 것입니다. 왜 데이터베이스로 변경할 필요가 있다고 생각합니까? 모든 단어를 메모리에로드하는 오버 헤드와 다중 사용자가 걱정 되십니까? 현재 구현은 어떻게 파일을 사용합니까? 빠른 액세스를 위해 해시 테이블에 단어를 저장하고 있습니까? ... – bedwyr

답변

2

? 많은 단어를 저장하는 데는 단지 몇 메가 바이트의 RAM이 필요하며 그렇지 않으면 파일에 자주 액세스하므로 어쨌든 캐시 될 수 있습니다. 단어 목록을 메모리에 보관하면 어떤 요구 사항에 가장 적합한 데이터 구조로 구성 할 수 있다는 이점이 있습니다. 그렇게 많은 메모리를 절약 할 수 없다면 주어진 검색어에 필요한 단어 목록의 일부만 효율적으로로드 할 수 있도록 데이터베이스를 사용하는 것이 유리할 수 있습니다. 물론이 경우에는 SQL의 인덱싱 기능을 활용할 수 있도록 일부 인덱스 열 (적어도 하나 이상)을 생성하십시오.

0

단어가 목록에 있는지 여부를 확인한다고 가정하면 색인 된 열이있는 SQLite가 단어 목록을 선형으로 검색하는 것보다 빠를 것이라고 말합니다. 자, 현재의 접근 방식이 당신의 목적에 충분히 빠르다면, 나는 데이터베이스로 이식하는 것을 귀찮게 할 이유가 없다. 당신이 걱정하는 한 그것은 아무런 이득도 얻지 못하는 것입니다. 검색 시간이 부담이된다면 인덱스 된 데이터베이스에 덤핑하는 것이 좋습니다.

CREATE TABLE words (
     word text primary key 
); 

CREATE INDEX word_idx ON words(word); 

을 그리고 당신의 데이터를 가져 오기 :

다음과 같은 스키마와 테이블을 만드는 방법을 메모리에 유지에 대해

sqlite words.db < schema.sql 
while read word 
do 
    sqlite3 words.db "INSERT INTO words values('$word');" 
done < words.txt 
0

나는 위에 나열된 이유로 데이터베이스를 건너 뜁니다. 메모리의 간단한 해시는 데이터베이스에서 빠른 검색을 수행합니다.

데이터베이스가 조회를 위해 조금 더 빠르더라도 DB를 사용하여 쿼리를 구문 분석하고 조회 계획을 작성한 다음 결과를 조합하여 프로그램으로 다시 보내야합니다. 또한 의존성을 줄일 수 있습니다.

프로그램의 다른 부분을 영구 저장소로 이동하려는 경우 이동하십시오. 그러나 해시 맵으로 충분해야합니다.

+0

? 데이터베이스는 메모리의 해시보다 적어도 100 배 이상 느려질 것입니다.그러나 해시 할 필요가 없습니다. 목록을 정렬하고 처음 26자를 기수로 시작한 다음 이진 검색을 수행하십시오. –

관련 문제