>  기사  >  백엔드 개발  >  Go의 슬라이스에서 요소를 효율적으로 제거하는 방법은 무엇입니까?

Go의 슬라이스에서 요소를 효율적으로 제거하는 방법은 무엇입니까?

PHPz
PHPz앞으로
2024-02-08 22:03:22692검색

如何在 Go 中高效地从切片中删除元素?

php 편집기 Apple은 Go의 슬라이스에서 요소를 효율적으로 삭제하는 방법을 소개합니다. Go 언어에서는 슬라이스의 요소를 삭제하는 것이 일반적인 작업입니다. 그러나 슬라이스의 특성상 요소를 직접 삭제하면 슬라이스의 길이가 변경되어 후속 작업에 영향을 줄 수 있습니다. 슬라이스의 요소를 효율적으로 삭제하기 위해 슬라이스의 특성과 일부 내장 함수를 사용할 수 있습니다. 일반적으로 사용되는 몇 가지 방법을 아래에서 자세히 소개합니다.

질문 내용

슬라이스 요소를 제거하는 방법에는 여러 가지가 있습니다. 하지만 많은 조각 처리를 수행하는 애플리케이션이 있다면 어떻게 될까요? Go 슬라이스는 새로운 요소를 추가하는 데 최적화되어 있지만, 슬라이스에서 요소를 제거하는 효율적인 방법이 있습니까(속도뿐만 아니라 메모리 최적화 측면에서도).

슬라이스에 대해 알고 있습니다. Go 1.21에 도입된 삭제 기능은 뒤에서 다음과 같은 잘 알려진 기술을 사용합니다.

으아악

이 경우 기본 배열이 줄어들지 않은 것 같습니다. 이는 속도 면에서는 좋지만, 요소가 너무 많고(100k 또는 1M) 이를 아주 적은 수(10개)로 줄이면 어떻게 될까요? 슬라이스 용량을 늘리는 데 사용되는 것과 같은 메모리 최적화는 없는 것 같습니다.

슬라이스의 요소 순서를 유지할 필요가 없는 경우 다음 방법을 사용할 수 있습니다(플레이그라운드 링크로 이동):

으아악

이것은 큰 조각이 있고 제거할 요소 수가 적을 때 유용합니다(그 뒤에 있는 아이디어는 적은 수의 조각 요소를 복사하는 것입니다).

메모리의 경우 용량은 두 경우 모두 동일하며 줄어들지 않습니다. 예:

으아악

그렇다면 메모리 사용량을 최적화할 수 있는 방법은 없을까요? 예를 들어, 슬라이스 길이가 용량의 절반 미만인 경우 용량을 절반으로 줄입니다.

또한 이와 같은 기술과 같이 이 작업을 효율적으로 수행하는 방법을 알고 싶습니다. s[:len(s):len(s)](slices.Clip에서 사용하는 전체 슬라이스 표현식)은 기본 배열을 줄이지 않습니다. 추가를 피하기 위해 슬라이스 구조에 새 용량만 저장합니다. new 요소가 하위 슬라이스에 연결될 때 상위 슬라이스 요소를 재정의합니다(이 제안에서 언급한 대로).

솔루션

"일반적으로 가장 좋은" 솔루션은 없습니다. 귀하의 질문에 여러 가지 접근 방식을 보여 주셨는데, 각 접근 방식은 특정 시나리오에 대해 다른 접근 방식보다 더 나을 수 있습니다.

이런 상황에 처해 있다면 많은 요소 중에서 몇 가지 요소를 유지하고 싶을 때 해당 요소를 삭제하지 마세요. 이러한 요소를 사용하여 새 슬라이스를 만듭니다. 속도가 빨라지는 것 외에도 메모리 문제도 확실히 해결됩니다.

새 슬라이스를 할당하고 사용하는 것 외에 전체 슬라이스 표현식을 사용하면 메모리 사용량을 줄일 수 없습니다. 백업 배열에 대한 참조가 있는 한 축소되지 않습니다(적어도 현재 Go 버전에서는 그렇지 않음). 대규모 지원 배열이 할당되었지만 그 중 작은 부분만 사용되는 상황이 발생하는 경우 새 슬라이스를 할당하고 요소를 수동으로 복사하여 대규모 배열이 가비지 수집되도록 할 수 있습니다.

또한 많은 요소를 제거해야 할 매우 큰 슬라이스가 있는 경우 슬라이스가 사용하기에 가장 적합한 데이터 구조가 아닐 수도 있다는 점을 고려하세요. 예를 들어 연결된 목록을 사용해 보거나 지도를 사용해 볼 수도 있습니다. 연결 목록이나 지도에서 요소를 삭제하는 것이 훨씬 빨라지고 아래와 같이 지도는 빠른(O(n)) 조회 시간도 제공합니다.

위 내용은 Go의 슬라이스에서 요소를 효율적으로 제거하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제