2013-05-08 2 views
-1

스칼라에서는 객체를 생성하여 메모리에 유지할 수 있습니까? 이 질문이 아직 존재하지 않기를 바랍니다. 나는 스칼라 만의 특별한 것을 발견하지 못했다.Scala에서 객체를 메모리에 유지하는 방법은 무엇입니까?

특정 국가의 우편 번호 데이터의 CSV 파일을 읽고 싶습니다. 너무 큽니다. 따라서 메모리에 맞춰야합니다. 우편 번호와 해당 도시를 개체에 저장하십시오. 예 : 키로 우편 번호, 값으로 citi). 나중에이 개체에서 특정 우편 번호를 검색하려고합니다. 존재한다면? 만약 그렇다면 나는 또한 해당 citi (es)를주고 싶다. 하지만 이제는이 함수를 호출 할 때마다 CSV 파일을 반복해서 읽고 싶지 않습니다. 그래서 데이터를 메모리에있는 객체에 보관하려고합니다. 스칼라에서 그렇게 할 방법이 있습니까? 객체가 이미 메모리에 존재하는지 또는 객체를 생성해야 하는지를 어떻게 확인할 수 있습니까?

아무도 내가 뭘 찾아야 할 힌트가 있습니까?

+1

예, * variables *라고합니다. 이러한 메커니즘은 수십 년 전에 발명되었으며 스칼라에 특화된 것이 아닙니다 ;-) 그냥 csv를 읽고'Map' 구조체에 데이터를 넣으십시오. –

+0

예, 맵 변수에 내용을 저장하고 싶습니다. :)하지만 함수를 다시 호출하면 변수가 이미 존재하는지 여부를 어떻게 알 수 있습니까? 이것을 어떻게 확인할 수 있습니까? – bam098

+1

컴파일 시간에 scala 변수 존재 (* 선언 * 기준)가 검사됩니다. 또한 variable * instantiation *이라는 개념이 있습니다. 변수는 선언되었지만 아직 설정되지 않았습니다. 참조 유형 (Map과 같은)은 선언되었지만 아직 초기화되지 않은 변수는 * null * (java와 동일)로 설정되므로 변수 foo가 * 의미있는 * 값으로 설정되었는지 여부를 확인하려면 보통 foo와 null을 비교하기에 충분합니다 :'foo == null'. 범죄로 받아들이지 마라.하지만 아마도 프로그래밍 과정을 택하거나 자바 책 (java *와 같은 생각)을 보도록하는 것이 더 좋다. ... –

답변

1

지도를 만든 후에는 가비지 수집 될 때까지 메모리에 남아 있습니다. 지도를 참조하는 객체가없는 경우 가비지 수집기가 삭제하려고합니다. 당신은 당신의 프로그램 주위에 당신의지도에 대한 참조를 전달할 수 있기 때문에 절대 삭제되지 않도록하거나 정적으로 만들 수 있습니다.

object storedData { 
    lazy val data : Map[...] = // read file 
} 

그런 다음이에서 읽을 수 있습니다 : -

은 당신은 클래스의 정적 멤버로 넣을 수있는 자바에서

스칼라에서 병렬는 다음과 같이 보일 수있는 단일 객체에 넣어하는 것입니다 프로그램의 어느 위치에서든지 storedData.data를 호출하면됩니다.

+0

그래서 싱글 톤 객체는 가비지 수집에 의해 삭제되지 않습니까? 그리고 나는 그것을 부를 수 있을까? 그리고 그것이 존재하지 않는다면 "생성자"(내가 파일을 읽은 게으른 발)를 실행하고, 이미 존재한다면 그것은 단지 취해진 것입니까? 이것은 시원할 것이다. 나는 그것을 시도 할 것이다. 고마워. :) – bam098

+0

나는 싱글 톤 객체로 진행되는 다른 것들이있을 수 있다고 믿습니다. 생성자라고 부르기에는 "정확하지"않을 것입니다. 이것은 값 필드 일뿐입니다. 그러나 lazy 키워드는 첫 번째 호출에서 평가되고 메모리에 저장된다는 것을 의미합니다. –

+0

@SimonTodd 스칼라에서 클래스의 본문이 기본 생성자라고하기 때문에 올바른 것이라고 말할 수 있습니다. 유일한 필드가있는 객체에'lazy'를 사용하지 않는 것이 조금 필요하지 않습니까? –

관련 문제