SyncGallery 팀 소식

파일 10만 개에서 100만 개로

모든 앱에는 개발자가 조용히 기준으로 삼는 숫자가 있습니다. 저희에게는 그 숫자가 파일 10만 개였습니다. 실제 사용자들을 만나기 전까지는요.

휴대전화 갤러리가 잘 정리된 사진 썸네일의 넓은 들판으로 펼쳐지는 모습

넉넉해 보였던 목표

SyncGallery를 만들기 시작할 때 저희는 분명한 성능 목표를 정했습니다. 기기에 미디어 파일이 10만 개 있어도 앱이 빠르게 작동해야 한다는 것이었죠. 모든 알고리즘을 그 숫자를 염두에 두고 작성했고, 대략 그 정도 크기의 라이브러리로 테스트했습니다.

당시에는 10만 개면 넉넉해 보였습니다. 하루도 빠짐없이 매일 사진 30장을 찍어도 그 수에 이르려면 약 9년이 걸립니다. 휴대전화에 그보다 많은 파일을 두는 사람은 없을 거라고 확신했습니다.

사용자들이 틀렸음을 보여 주었습니다

첫 출시 직후, 그 가정이 얼마나 틀렸는지 알게 되었습니다. 실제 라이브러리는 저희가 정한 한계보다 훨씬 컸습니다. 수년 치 카메라 보관 사진, 예전 휴대전화와 컴퓨터에서 옮겨 온 사진, 대용량 메모리 카드에 저장된 가족 사진 전체가 있었습니다. 여전히 많은 Android 휴대전화가 512GB나 1TB 메모리 카드를 지원하며, 이는 원래 목표보다 몇 배나 큰 라이브러리를 담을 수 있는 공간입니다.

앱이 100,001번째 파일에서 갑자기 멈춘 것은 아닙니다. 성능 한계는 그렇게 친절하게 드러나지 않습니다. 대신 즉시 끝나야 할 작업이 눈에 띄게 오래 걸렸고, 라이브러리가 목표를 넘어 커질수록 사용 경험은 점점 나빠졌습니다. 가장 큰 라이브러리를 가진 사람들, 어쩌면 백업 앱이 가장 필요한 사람들에게 그것은 충분하지 않았습니다.

규모가 10배가 되면 무엇이 달라질까

파일 10만 개에서는 문제없던 많은 지름길이 100만 개에서는 문제가 됩니다. 패턴은 늘 같습니다. 라이브러리와 함께 비용이 조용히 커집니다.

  • 모든 것을 메모리에 담아 두기. 항목 10만 개짜리 목록은 RAM에 넉넉히 들어갑니다. 그 10배 크기에 여러 화면과 캐시가 곱해지면 메모리 부족으로 화면이 끊기고, 최악의 경우 앱이 멈춥니다.
  • 몇 개만 바뀌었는데 모든 파일을 다시 확인하기. 사진 몇 장이 들어왔다고 라이브러리 전체를 다시 살펴보는 일은 파일 10만 개에서는 거의 티가 나지 않습니다. 100만 개에서는 눈에 보이는 이득 없이 몇 분 동안 백그라운드 작업이 이어질 수 있습니다.
  • 변경이 있을 때마다 화면 업데이트하기. 처리한 파일마다 한 번씩 업데이트하는 것은 작은 라이브러리에서는 알아차리기 어렵습니다. 변경이 수만 개씩 몰려오면 화면이 멈출 수 있습니다.
  • 캐시가 끝없이 커지도록 두기. 크기 제한이 없는 캐시는 결국 속도를 높이려던 바로 그 화면과 자원을 다투게 됩니다.

이것들은 특이한 버그가 아닙니다. 규모가 한 자릿수 커지면 더 이상 통하지 않는 평범한 설계 결정입니다.

100만 개를 목표로 다시 만들기

저희는 목표를 파일 100만 개로 높이고, 그 숫자를 새로운 기준으로 삼아 앱 전체를 다시 살펴보았습니다. 이제 몇 가지 원칙이 저희가 만드는 모든 것을 이끕니다.

  • 라이브러리가 커져도 메모리 사용량은 일정하게. 가장 무거운 목록 화면은 이제 모든 것을 메모리에 담아 두지 않고 데이터베이스에서 파일을 구간별로 불러옵니다. 큰 이미지 캐시에는 크기 제한이 있어 끝없이 커지지 않고 오래된 항목을 비웁니다. 이 작업은 화면별로 계속 진행 중입니다. 모든 곳에서 결승선을 통과했다는 뜻이 아니라, 이제 저희가 지키며 개발하는 원칙이라는 뜻입니다.
  • 다시 읽지 말고 비교하기. 스캔은 모든 것을 다시 처리하지 않고 무엇이 바뀌었는지 추적합니다. 클라우드 서비스가 변경 피드를 제공하면 폴더 전체를 다시 나열하지 않고 그 변경 사항을 사용합니다.
  • 화면이 라이브러리를 기다리게 하지 않기. 무거운 작업은 보이지 않는 곳에서 묶음 단위로 실행됩니다. 화면 업데이트를 합쳐서 처리하므로 변경 10,000건이 한꺼번에 들어와도 화면을 10,000번 다시 그리지 않습니다.
  • 실제 라이브러리를 담은 실제 기기에서 측정하기. 추측 대신 프로파일링을 합니다. 가장 큰 개선은 측정하지 않았다면 결코 의심하지 않았을 곳에서 나왔습니다.

빠른 속도는 이정표가 아니라 습관입니다

가장 중요한 변화는 어느 한 가지 수정이 아니었습니다. 파일 100만 개라는 질문을 모든 새 기능을 평가하는 방식의 일부로 만든 것입니다. 라이브러리가 예상보다 10배 크다면 이 화면, 이 스캔, 이 캐시는 어떻게 될까?

저희가 어떤 숫자를 정하든 누군가는 그 숫자를 넘어설 것이고, 이번에는 미리 준비해 두고 싶습니다.

라이브러리가 아주 크다면, 이 작업은 바로 당신을 위해 한 것입니다. 사용하시는 컬렉션에서 SyncGallery가 느리게 느껴진다면 알려 주세요. 실제 라이브러리는 인위적인 벤치마크보다 훨씬 많은 것을 알려 줍니다.

SyncGallery

SyncGallery 사용해 보기

클라우드 동기화를 직접 제어하는 Android용 갤러리 앱.

Google Play에서 다운로드
블로그의 다른 글맨 위로