[파이썬] Gensim의 메모리 최적화

Gensim은 토픽 모델링 및 자연어 처리를 위한 파이썬 라이브러리로 유명하다. 그러나 대량의 텍스트 데이터를 다룰 때 메모리 사용량이 높아지는 문제가 있다. 이러한 메모리 사용량을 최적화하기 위해 Gensim에서 제공하는 몇 가지 방법들을 살펴보자.

1. 메모리 사용량 제한

Gensim은 Memory 클래스를 통해 메모리 사용량을 제한하는 기능을 제공한다. 이 클래스를 사용하면 Gensim이 디스크에 저장된 데이터를 처리하게 되고, 필요할 때 메모리에 로딩한다. Memory 클래스를 사용하기 위해서는 tmp_dir 인자를 통해 임시 디렉토리를 설정해주어야 한다.

from gensim.test.utils import datapath
from gensim import utils

tmp_dir = "/path/to/tmp/dir"
data_path = datapath(utils.get_tmpfile())
memory = utils.Memory(data_path, mmap='r', tmp_dir=tmp_dir)

2. 디스크 기반 코퍼스

Gensim은 문서 집합을 메모리에 로딩하는 것 대신에 디스크에 저장하는 방식도 제공한다. corpora.TextCorpus 클래스를 사용하여 디스크 기반의 코퍼스를 만들 수 있다.

from gensim.corpora import TextCorpus

corpus_dir = "/path/to/corpus/dir"
corpus = TextCorpus(corpus_dir)

3. 스트리밍 코퍼스

대량의 텍스트 데이터를 처리할 때는 한꺼번에 메모리에 로딩하는 것이 아니라 스트리밍 방식으로 처리하는 것이 효율적이다. Gensim은 corpora.TextCorpus 를 상속하여 스트리밍 코퍼스를 만들 수 있다.

from gensim.corpora import TextCorpus

class StreamingCorpus(TextCorpus):
    def __iter__(self):
        # 데이터를 스트리밍 방식으로 읽어오는 코드 작성
        yield self.process_text(text)

corpus_dir = "/path/to/corpus/dir"
corpus = StreamingCorpus(corpus_dir)

4. 점진적인 학습

메모리를 효율적으로 사용하기 위해서는 점진적인 학습 방식을 사용할 수 있다. Gensim의 models.LdaModel 클래스는 점진적인 학습을 지원하기 때문에, 대량의 텍스트 데이터를 추가로 학습할 때 유용하다.

from gensim.models import LdaModel

corpus = TextCorpus("/path/to/corpus/dir")
model = LdaModel(corpus)
model.update(new_corpus)

이처럼 Gensim에서는 메모리를 최적화하기 위한 다양한 기능들을 제공하고 있다. 대량의 텍스트 데이터를 다룰 때는 이러한 기능들을 적절히 활용하여 메모리 사용량을 최소화할 수 있도록 해야 한다.