2017-04-15 1 views
1

그래서 1 억 3 천만 개의 요소가있는 Float32Array이 있습니다. 이러한 요소 중 일부는 결함이있어 배열에서 제거해야합니다.입력 된 배열의 크기를 조정해야하는 방법은 무엇입니까?

내가 한 것은 끝에있는 결함 요소를 이동 한 것입니다. 배열 크기를 조정하여 배열에서 요소를 제거하는 것이 쉬울 것이라고 생각했습니다. 놀랍게도 나는 그렇게 할 수있는 방법을 찾지 못했습니다.

메모리 제한 때문에 새 배열을 만들고 데이터를 복사하려고하지 않습니다.

달성하려는 방법이 있습니까? 거기에 메모리 중복없이 배열에서 해당 요소를 제거하는 방법이 있습니까?

감사합니다.

+0

자바 스크립트의 내 의견으로는, 이러한 작업 정확하게 최적 아니지만, 한 가지 당신은 배열의 끝에 결함이있는 요소를 교환하는 것을 고려할 수 있습니다 (이미 완료했다고 말했듯이). 그런 다음 해당 인덱스를 null로 설정하십시오. Javascript가 새로운 복사본을 만들지 않고 배열에서 요소를 크기를 조정하거나 제거하는 효율적인 방법을 제공한다고 생각하지 않습니다. 그러나, 나는 틀린 수 있습니다, 그래서 나는 왜 이것을 대답 대신에 주석으로 남겨두고 있습니다. – SpencerD

+0

두 번째 생각, Linked-List-like 설정 사용에 대해 생각해 보셨습니까? 이렇게하면 제거가 훨씬 간단 해지지만 배열의 편리한 메소드/속성을 잃을 수 있습니다. 그러나'previous.next = current.next'라고 말할 수 있기 때문에 중복없이 요소를 제거하는 기능이 훨씬 쉬울 것입니다. 그러면 효과적으로 가비지 수집으로 정리할 수있는 노드를 잘라냅니다. – SpencerD

+0

@SpencerD Thats는 나를위한 옵션이 아닙니다. 실제로 three.js를 사용하고 있습니다. 배열에 대해서 말하자면 정점 배열입니다. 배열을 입력해야합니다. 또한, 나는'null'을 설정하는 것이 나에게 도움이 될 것이라고 생각하지 않는다. –

답변

1

항목을 "제거"할 때 배열 끝에 넣지 말고 slice 메서드를 사용하면 동적으로 크기가 조정됩니다 (즉, arr.length이 업데이트 될 예정 임).

http://devdocs.io/javascript/global_objects/float32array http://devdocs.io/javascript/global_objects/typedarray/slice

편집 : @Dzmtrs에

들으 : 당신이 사용할 수있는 splice() 대신 slice()

+0

'array.slice (...)'는 OP가 피해야 할 원래 배열의 새로운 복사본을 반환합니다. – SpencerD

+0

기본 배열 (예 : 빈 배열)'array.slice()'는 동일한 (새로운 배열을 반환합니다)하지만 여러 번 사용했고 실제로 기본 배열에서 수정을합니다. 따라서 반환 값을 사용하지 않으면 반환 값을 취하는 원래 배열입니다. – Vivick

+0

hmm 재미있는 관찰. 나는 그걸 들여다 보지 못했지만 모질라 개발자 페이지를 읽었으며 새로운 배열을 되 돌렸다. 그러나, 만약 당신의 관찰이 옳다면,'array.slice()'는 분명히 갈 길입니다. – SpencerD

관련 문제