Rust 구조체, 데이터 직렬화 성능 문제, 비트맵으로 해결!

by DD
3개월 전
조회수 6

Rust 구조체(struct)는 간단하고 빠르지만, 많은 Nullable 필드를 가진 경우 성능 저하(Performance Degradation)를 유발할 수 있음

rkyv를 사용한 직렬화 과정에서 ArchivedString의 오버헤드로 인해 메모리 사용량이 증가하는 문제 발생

비트맵(Bitmap)을 사용하여 Nullable 필드의 존재 여부를 기록하고, 희소 레이아웃(Sparse Layout)을 통해 메모리 사용량 최적화

데이터베이스 정규화(Normalization)의 중요성과 구조체의 적절한 사용 시점에 대한 커뮤니티 논의(Community Discussion)가 진행됨

구조체(struct)와 직렬화(Serialization) 성능 문제

게시물에서는 Rust 구조체가 많은 Nullable 필드를 가질 경우, 직렬화 과정에서 성능 저하가 발생할 수 있음을 지적한다. 특히, rkyv를 사용한 직렬화에서 ArchivedString의 오버헤드로 인해 메모리 사용량이 증가하는 문제가 발생했다. 이는 SQL 테이블의 넓은 스키마(Wide Schema)와 Nullable 컬럼의 빈번한 사용으로 인해 더욱 심화되었다. 이러한 문제는 디스크 I/O(Disk I/O) 병목 현상으로 이어져 전체 시스템의 성능을 저하시킨다.

비트맵(Bitmap) 기반의 최적화

저자는 비트맵(Bitmap)을 사용하여 Nullable 필드의 존재 여부를 효율적으로 관리하는 방법을 제시한다. 각 필드에 대한 정보를 비트 단위로 저장하여 메모리 사용량을 줄이고, 데이터 접근 속도(Data Access Speed)를 향상시켰다. 또한, NoneUtils 트레이트(Trait)를 통해 Option과 일반 타입(Type)을 통일적으로 처리하여 직렬화 로직을 간소화했다. 이러한 접근 방식은 메모리 효율성(Memory Efficiency)을 극대화하는 데 기여한다.

희소 레이아웃(Sparse Layout)을 활용한 공간 절약

게시물에서는 희소 레이아웃(Sparse Layout)을 통해 메모리 공간을 더욱 절약하는 방법을 소개한다. 비트맵과 포인터(Pointer)를 사용하여 실제로 존재하는 값만 저장하고, Null 값은 건너뛴다. 이를 통해 데이터 직렬화 크기(Data Serialization Size)를 줄이고, 디스크 I/O(Disk I/O) 성능을 향상시켰다. 특히, 넓은 SQL 테이블(SQL Table)에서 Nullable 컬럼이 많은 경우, 이러한 최적화는 성능 향상(Performance Improvement)에 큰 영향을 미친다.

데이터베이스 정규화(Normalization)와 구조체의 적절한 사용

댓글에서는 데이터베이스 정규화(Normalization)를 통해 구조체의 복잡성을 줄이고, 성능 문제를 예방할 수 있다는 의견이 제시되었다. 또한, 프로젝트 초기에 과도한 설계(Over-Engineering)를 지양하고, 단순한 구조체(struct)를 먼저 사용하는 것이 좋다는 조언도 있었다. 이는 코드의 가독성(Code Readability)유지 보수성(Maintainability)을 높이는 데 기여하며, 불필요한 복잡성을 피하는 데 도움이 된다.

Nobody ever got fired for using a struct (blog)