누락 된 데이터를 확인할 수 있도록 특정 data.table을 만들고 싶습니다. 이 경우 누락 된 데이터는 NA가 있다는 것을 의미하지는 않지만 전체 행은 제외됩니다. 그래서 다른 컬럼에서 어떤 레벨의 값이 누락되었는지를 알 수 있어야합니다. 누락 된 값이 많거나 데이터 세트 전체에 퍼져있는 경우에도 중요합니다.이러한 데이터를 효율적으로 병합하는 방법
그래서이 테이블은 6.000.000x5 data.table (테이블 A라고 함)에 시간 종속 변수, 레벨 ID 및 최종 테이블에 추가하려는 값 N이 들어 있습니다.
다른 테이블 (TableB)은 207x2입니다. 이것은 인자에 대한 ID를 TableC의 열에 연결합니다.
표 C는 1.500.000x207이며, 207 개의 각 열은 표 B에 따른 ID에 해당하며 행은 표 A의 시간 종속 변수에 해당합니다.
이 테이블은 크며 최근에 여분의 RAM (총 8GB까지)을 얻었지만 컴퓨터는 TableC를 스왑하고 각 쓰기에 대해 다시 호출해야하며 이후에 다시 스왑됩니다. 이 교환은 내 시간을 소비하는 것입니다. TableA의 행당 약 1.6 초, TableA에 6.000.000 행이 있으므로이 작업은 100 일 이상 논스톱으로 실행됩니다.
현재 for 루프를 사용하여 TableA 행을 반복합니다. 이 for 루프 루프를 아무런 조작없이 거의 즉시 수행합니다. TableA와 TableB에서 TableC에 대한 올바른 열과 행 번호를 찾고 TableA에서 TableC로 값을 쓰는 한 줄 명령을 만들었습니다. 시스템을 수행하기 위해이 한 줄을 끊었습니다. 시간 분석 및 각 단계는 큰 TableC에 쓰는 것을 제외하고는 약 0 초가 걸립니다. 이것은 테이블에 값을 쓰는 것이 가장 시간이 많이 걸리고 내 메모리 사용을보고 있음을 보여주었습니다. 필자는 쓰기가 발생할 때마다 나타나는 거대한 덩어리를 볼 수 있으며, 마자 마자 마자 사라집니다.
TableA <- data.table("Id"=round(runif(200, 1, 100)), "TimeCounter"=round(runif(200, 1, 50)), "N"=round(rnorm(200, 1, 0.5)))
TableB <- data.table("Id"=c(1:100),"realID"=c(100:1))
TSM <- matrix(0,ncol=nrow(TableB), nrow=50)
TableC <- as.data.table(TSM)
rm(TSM)
for (row in 1:nrow(TableA))
{
TableCcol <- TableB[realID==TableA[row,Id],Id]
TableCrow <- (TableA[row,TimeCounter])
val <- TableA[row,N]
TableC[TableCrow,TableCcol] <- val
}
에 대한 루프의 마지막 단계에서 메모리 스왑을 방지하여,이 작업을 빠르게하는 방법을 다른 사람이 나에게 조언을 할 수 있습니까?
편집 : @Arun의 조언에 따라 테스트 할 더미 데이터를 개발할 시간이있었습니다. 위에 주어진 코드에 포함되었습니다. 더미 데이터가 무작위이고 루틴이 작동하기 때문에 원하는 결과가 포함되지 않았습니다. 그것은 문제의 속도입니다.
문제의 최소한의 재현 가능한 예와 필요한 솔루션을 제공해주십시오. ATM을 따라 가기에는 텍스트가 너무 많습니다. – Arun
일부 코드는 제공 할 수 있지만 데이터는 제공 할 수 없습니다. 또한 어떻게 메모리 문제의 재현 가능한 예를 만들 수 있습니까? – Gullydwarf
생각해 봅시다. 테이블의 작은 데이터 세트를 생성하는 코드를 제공 할 수 있습니다. 그런 다음 코드가 무엇인지 보여주십시오. 그런 다음 해당 코드의 결과를 보여주십시오. 그런 다음 이것이 데이터 차원에 맞게 확장되지 않는다고 설명하십시오. 그런 다음 메모리 문제를 해결할 수있는 방법을 묻습니다. 또한 메모리 문제를 말하고 "이 작업을 더 빨리 수행하려면 어떻게해야합니까?"라는 질문으로 게시물을 끝내십시오. – Arun