범위가 데이터 프레임 및 스파크와 함께 작동하는 방식에 대해 궁금합니다. 아래 예제에서 파일 목록을 가지고 있습니다. 각각 데이터 프레임에로드되고 일부 작업이 수행 된 다음 디스크에 dfOutput
을 씁니다.스파크 - 범위, 데이터 프레임 및 메모리 관리
val files = getListOfFiles("outputs/emailsSplit")
for (file <- files){
val df = sqlContext.read
.format("com.databricks.spark.csv")
.option("delimiter","\t") // Delimiter is tab
.option("parserLib", "UNIVOCITY") // Parser, which deals better with the email formatting
.schema(customSchema) // Schema of the table
.load(file.toString) // Input file
val dfOutput = df.[stuff happens]
dfOutput.write.format("com.databricks.spark.csv").mode("overwrite").option("header", "true").save("outputs/sentSplit/sentiment"+file.toString+".csv")
}
- 루프가 완료되면 폐기
for loop
내부의 각 데이터 프레임, 또는 메모리에 남아 있습니까? - 폐기되지 않은 경우 현재 메모리 관리를 수행하는 더 좋은 방법은 무엇입니까?
감사합니다. 매우 유익한 답변입니다! –
df에 대한 선형 변환 과정이 주어지면 df1 = df0.bla(); df2 = df1.blabla(); df3 = df2.blablabla(), 언제 df1가 garbaged? 스코프가 끝나거나 프로그램이 깨달을 때 더 이상 줄을 사용하지 않을 것입니다 (df1을 더 이상 호출 할 필요가 없기 때문에 df2가 기본적으로 만들어집니다). –
하위의 RDD ('df2'의 경우와 유사)는 부모 ('df1'의 부모)를 참조합니다. 따라서 'df1'은 범위를 벗어난 경우에만 수집되며 모든 자손은 가비지 수집됩니다. 이는 RDD가 게으르기 때문입니다. 'df1'의 명령 (예 : "이 파일 읽기")은 작업 (예 : "행 계산")이 수행 될 때만 즉시 실행되지 않습니다. 따라서 참조는 조상 RDD에 보관되어야합니다. –