2010-12-04 3 views
19

파일 읽기 및 쓰기가 포함 된 프로그램을 만드는 것이 처음입니다. 사실이 일을하는 가장 좋은 방법이 무엇인지 궁금합니다. 왜냐하면 내가 반 친구들과 내 작업을 비교했을 때, 우리의 논리는 서로 매우 다릅니다.C 프로그래밍 파일 읽기/쓰기 기술

우리 선생님은 사용자가 레코드를 추가, 편집 및 삭제할 수있는 간단한 학생 목록 시스템을 요청했습니다. 그리고 그는 우리가 프로그램을 사용할 때 다음 레코드에 액세스 할 수 있도록 모든 레코드를 저장하는 파일을 만들 것을 요구했습니다.

이 문제에 대한 해결책은 프로그램이 메뉴를 열기 전에, 모든 레코드를 읽고 배열 []에 저장하는 것입니다. 그렇게하면 모든 기록을 조작 할 수 있습니다. 그런 다음 사용자가 프로그램을 종료하기 전에 동일한 파일에 저장하고 모든 레코드를 덮어 씁니다.

내 급우의 해결책은 다음과 같습니다. 레코드를 추가하면 파일에 액세스하고 데이터를 추가하고 레코드를 편집 할 때 파일에 액세스하여 특정 레코드를 편집하고 레코드를 삭제하면 파일에 액세스하여 레코드를 삭제합니다. 그래서 그녀가 한 일은 그녀가 만든 모든 기능에 대한 것입니다, 그녀는 파일에 액세스하고 있습니다.

우리 작품은 물론 코드 작성이 가능합니다. 하지만 수천 또는 수백만 건의 레코드를 다루는 경우 더 효율적이고 효과적으로 사용하는 것이 궁금합니다. 아니면 우리가 한 것보다 다른 솔루션이 더 있습니다. 어쩌면 당신은 파일 처리 경험을 우리와 공유 할 수 있습니다 ... 고맙습니다.

+3

나는이 질문에 오늘의 나의 마지막 upvote를 보냈다. 그리고 그것은 더 가치가있을 수 없었다. 일관되고 철저한 질문을 작성해 주셔서 감사합니다. 사이트를 처음 접하는 다른 모든 사람들이 귀하의 모델을 따른다면 ... –

+0

Mr. Grey Mr. Grey – newbie

답변

14

이것은 프로그래밍 시간과 시간이 다시 만나는 전형적인 경우입니다. 속도 나 메모리 사용량을 최적화합니까?

그런 수수께끼와 마찬가지로 "올바른"대답이나 완벽한 해결책이 없습니다. 다시 말해서, 당신과 당신의 급우는 모두 문제 해결에있어 옳습니다.

모든 레코드를 메모리에로드하는 솔루션을 사용하면 런타임시 각 레코드에 대한 액세스 및 수정을보다 빠르게 수행 할 수 있도록 메모리를 "소비"합니다. 배열의 모든 레코드를 메모리에 저장하는 것은 공간을 차지하지만 메모리 액세스가 디스크 액세스보다 거의 무한히 빠르기 때문에 접근 방식이 급우보다 훨씬 빠릅니다.

반대로 귀하의 클래스 메이트는 하드 디스크에서 필요할 때 데이터를로드 할 때까지 기다리면서 RAM을 절약합니다. 하드 디스크를 치는 것은 이미 메모리에있는 데이터를 가져 오는 것과 비교하면 대단히 비싼 프로세스이며, 사용자가 변경 할 때마다 을 붙잡아 버릴 것입니다.. 프로그램을 시작하는 데 걸리는 시간과 이미 열려있는 시간으로 전환하는 방법에 대해 생각해보십시오.

그리고 그 안에는 절충안이 있습니다. 중요한 것들 중 일부는 여기에 자신에게 물어 있습니다

  1. 이 너무 커서 메모리에 완전히 맞도록 (또는 너무 커질 것) (당신이 처리됩니다 일반적인 구성) 데이터 세트인가? 일반적으로 작은 데이터 세트를 다루는 경우, 컴퓨터에는 이제 충분한 RAM이있어 아마도 그만한 가치가있을 것입니다.

  2. 얼마나 빨리 데이터에 액세스 할 수 있어야합니까? 실시간 액세스가 중요합니까? 특히 대형 또는 복합물 데이터 세트가 필요에 따라 하드 디스크에서로드하는 데 너무 오래 걸립니까? 어떤 종류의 성능을 사용자가 기대합니까?

  3. 응용 프로그램이 어떤 종류의 시스템을 타겟팅합니까? 때때로 임베디드 시스템 및 기타 특별한 경우에는 고유 한 설계 접근 방식이 필요합니다. RAM이 풍부하고 고정 스토리지의 양이 제한되어있을 수도 있고 그렇지 않을 수도 있습니다. 표준적이고 현대적인 PC 하드웨어를 사용한다면, 사용자가 원하거나 필요로하는 것은 무엇입니까? 대부분의 타겟 사용자가 이미 상대적으로 "쇠고기"하드웨어를 사용하고 있다면 잠재 고객이 더 큰 잠재 고객을 목표로 삼는 경우와는 다른 디자인 결정을 내릴 수 있습니다. 요구 사항.

  4. 특별한 상황을 허용해야합니까? 여러 사용자가 동시에 액세스하는 것과 같은 일들은 메모리에있는 모든 데이터를 훨씬 더 어렵게 만듭니다. 다른 사용자가 로컬 컴퓨터의 메모리에만 저장된 데이터를 어떻게 읽을 수 있습니까? 공통 파일 (아마도 공유 서버에서도)을 공유하는 것이 아마도 여기에 필요할 것입니다.

  5. 다른 사람보다 자주 액세스되는 데이터의 특정 부분이 있습니까? 이러한 특정 부분을 항상 메모리에 유지하고 나머지는 지연로드하는 것을 고려하십시오. 즉, 사용자가 액세스하는 경우 메모리에 가져 오려고합니다.

마지막으로 암시 된 것처럼 균형 잡힌 방식이나 결합 된 방식은 아마도 "이상적인"솔루션에 도달하는 것과 거의 비슷합니다. 가능한 한 RAM에 많은 양의 데이터를 저장할 수 있으며 응용 프로그램의 유휴 상태에서 디스크의 파일에 주기적으로 편집 내용이나 수정 사항을 다시 기록 할 수 있습니다. 평균적인 프로그램이 사용자에게 무엇인가를하기 위해 기다리는 데는 많은 시간이 걸립니다. 이러한 유휴 CPU주기를 활용하여 메모리에 저장된 내용을 디스크로 플러시하고 속도를 크게 떨어 뜨리지 않고 사용할 수 있습니다. 이 접근 방식은 소프트웨어 개발에서 항상 사용되며 EClaesson의 대답으로 지적 된 함정을 피하는 데 도움이됩니다. 응용 프로그램이 충돌하거나 예기치 않게 종료되는 경우 이 대부분이 (가) 뒤에서 디스크에 이미 커밋 되었기 때문에 데이터의 매우 작은 부분 만 손실 될 수 있습니다.

추신 : 물론는 다크 팔콘의 대답은 생산 응용 프로그램에서, 당신이 더 많은 것보다는 아마 데이터를 처리하는 데이터베이스 같은 것을 사용하는 것이 올바른 것입니다. 그러나 이것이 교육 목적으로 보이는 것 같기 때문에 각 접근법의 기본 거래를 이해하는 것이 훨씬 더 중요하다고 생각합니다.

+0

와우 감사합니다 아주 좋은 설명을 주셔서 감사합니다 .. :) – newbie

+0

Nioe 대답! 저는 항상 교사들이 학생들이 이러한 작업을 위해 자신의 메커니즘을 작성하도록 주장하는 이유에 대해 궁금해했습니다. 나는 누군가가 데이터베이스 라이브러리를 작성해야한다는 것을 이해한다. 그러나 실제 현실 세계 프로그래밍은 이러한 과제와 거의 같지 않다.때로는 thedailywtf.com의 기사 중 일부가 실습에서 배운 것들을 실제 응용 프로그램에 적용하는 사람들로부터 온 것인지 궁금합니다. –

+0

나는 이것을 고전이라고 부르지는 않겠지 만 사람들은 너무 자주 메모리 최적화의 필요성을 무시한다. –

2

귀하의 버전 (모든 기록을 메모리에 보관)이 가장 빠를 것입니다. 레코드 수가 증가하더라도 메모리가 충분해야합니다. 이것에 대한 나쁜 점은 프로그램 충돌이나 부정확 한 종료로 인해 결코 파일에 저장되지 않은 모든 데이터가 손실된다는 것입니다.

당신이 할 수있는 가장 빠른 방법은 파일 io가 빠르지 않기 때문입니다. 그러나 대부분의 데이터가 이미 파일에 저장되므로 더 적은 메모리가 필요하고 충돌시 더욱 안전합니다.

+0

무엇을 권할 만합니까? 감사합니다 – newbie

+0

또한 메모리/속도 상충 관계가 있습니다. – Oded

+0

나는 그를 정기적으로 파일을 저장하도록 제안 할 것이다. 타이머를 설정하고 10 분이 지나면 계속하기 전에 메모리에 파일을 씁니다. – LostInTheCode

5

심각한 응용 프로그램에서는 좋은 프로그래머가 기존 라이브러리를 사용하여 데이터를 관리 할 수 ​​있습니다. 이 도구를 선택하는 것은 정확한 요구 사항에 따라 달라집니다.

  1. 여러 사용자가 동시에 액세스해야합니까?
  2. 여러 컴퓨터에서 액세스해야합니까?

등 MySQL은, 포스트 그레스, 마이크로 소프트 SQL 서버, SQLite는, 같은 SQL 기반 데이터베이스를 것 상당량의 정보를 저장하기위한 가장 일반적인 선택이 주로 당신보다 당신의 동급생의 솔루션을 더 닮은.

+0

+1, 동의합니다. SQL 데이터베이스는 제가 제안하려고했던 것이 었습니다. 이미 SQL로 초보자가 작업 할 수 있도록 이미 많은 라이브러리를 만들었습니다. – LostInTheCode

+0

답변 주셔서 감사합니다. :) – newbie

2

이것은 실행 시스템의 세부 사항, 데이터 세트의 크기 및 CPU 시간 대 개발 시간의 상대적 비용을 알지 못하면 대답 할 수없는 질문입니다. 시스템에 충분한 메모리가있는 경우 램을 사용하는 것이 좋습니다. 매우 제한된 램 (오늘날은 임베디드 응용 프로그램에서 주로 사용됨)이있는 소형 시스템에서는 디스크 파일을 업데이트해야 할 수 있습니다. 생각해 볼만한 다른 사항은 운영 체제가 디스크에 실제 쓰기 전에 수행 할 수있는 버퍼링, 프로그램이 충돌하는 경우 파일의 일관성에 어떤 영향이 있는지, 디스크에 쓰기가 실제로 느리거나 쓰기 횟수가 제한되어 있습니다 (일부 플래시 디스크 기술).

이것이 오늘날의 데스크탑 컴퓨터에서 발생하는 작은 실용적인 문제인 경우, 작은 데이터 세트를 실행하는 데 걸리는 상대적으로 중요한 시간에 대해 다양한 솔루션을 개발하는 데 소요되는 시간을 고려할 수도 있습니다.

또한 오늘날 파일 시스템에서 데이터베이스를 만드는 대신 관련 문제를 처리하는 기존 데이터베이스를 사용하여 문제를 해결하는 것이 좋습니다.

+0

올바른, 올바른 기술적 견해입니다. 그러나 이것이 C++ 숙제 임으로 보아 몇 백 기가 바이트의 데이터베이스 파일을 처리하거나 일종의 고어적 기계에서 실행되기를 기대하는 것은 터무니 없습니다. – LostInTheCode

+0

미스터 크리스와 미스터 lostcode – newbie

1

고정 된 크기가 아닌 레코드를 편집하는 것은 미묘합니다. 바이너리 형식에서는 행을 사용하지 않는 것으로 표시하는 것이 가능합니다 (예 : 외부 색인 또는 화이트 아웃 사용). 파일 시스템은 원 자성이 아니므로, 여러분이 한 일이 디스크 전체에서 끝난다는 것을 확신 할 수는 없습니다.

이렇게하면 학생 메모 응용 프로그램의 나머지 부분보다 문제가 더 복잡해지고 데이터베이스에 가장 잘 위임됩니다 (SQLite 및 TokyoCabinet은 더 가볍습니다). 데이터베이스를 사용할 수 없다면 간단한 구현으로 진행하십시오. 버그가 적어지며 데이터베이스로 대체 할 때가 지 않을 것입니다. 따라서 메모리에있는 전체 파일을 읽는 것이 최선의 선택이라고 생각합니다.

관련 문제