> 백엔드 개발 > Golang > 이동 중에 블로팅 없이 희소 파일을 효율적으로 복사하려면 어떻게 해야 합니까?

이동 중에 블로팅 없이 희소 파일을 효율적으로 복사하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-11-03 17:06:02
원래의
685명이 탐색했습니다.

How Do You Efficiently Copy Sparse Files in Go Without Bloating?

io.Copy()로 인한 희소 파일 부풀림

io.Copy()로 파일을 복사할 때 큰 희소 파일이 불균형적으로 커지는 경향이 있습니다. 목적지에서. 이 동작은 파일 홀에 대한 정보를 전달하는 수단이 부족한 io.Copy()의 원시 바이트 처리에서 비롯됩니다.

홀 처리

홀을 관리하려면 , syscall 패키지를 더 깊이 파고들어 lseek(2)에 대한 SEEK_HOLE 및 SEEK_DATA 값을 수정해야 합니다. 안타깝게도 이러한 값은 표준 syscall 패키지나 golang.org/x/sys 패키지에는 없습니다.

해결책

이를 극복하려면 다음 단계를 따르세요.

  1. 지원되는 플랫폼에서 syscall.Seek()를 lseek(2)에 매핑합니다.
  2. 대상 플랫폼에 대해 SEEK_HOLE 및 SEEK_DATA의 올바른 값이 다를 수 있으므로 결정합니다.

예를 들어 Linux에서는 다음을 사용할 수 있습니다.

// +build linux

const (
    SEEK_DATA = 3
    SEEK_HOLE = 4
)
로그인 후 복사

희소 파일 읽기 및 전송

데이터 영역을 감지하고 희소 파일을 읽는 동안. 희박성이 그대로 유지된 파일을 전송하는 경우 프로세스가 더 복잡해지고 플랫폼별 고려 사항이 필요합니다.

Linux 관련 접근 방식

Linux에서는 fallocate(2)를 다음과 함께 사용합니다. FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE는 파일 끝에 구멍을 뚫습니다. 실패하면 구멍을 덮기 위해 제로 블록을 삽니다.

추가 참고 사항

  • FAT와 같은 일부 파일 시스템은 구멍을 지원하지 않습니다.
  • 데이터 복사 없이 더 빠른 파일 이동을 위해 syscall.Rename() 사용을 고려하려면 소스와 대상이 동일한 파일 시스템에 있는지 확인하세요.

위 내용은 이동 중에 블로팅 없이 희소 파일을 효율적으로 복사하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿