이 질문은 내가 가졌던 질문에서 비롯되었습니다.스택 교환.
저는 Windows 공유를 마운트 mount -t cifs -o username=username,password=password,rw,nounix,iocharset=utf8,file_mode=0777,dir_mode=0777 //192.168.1.120/storage /mnt/storage
한 다음 데비안 시스템의 마운트 지점에서 스크립트를 실행했습니다.
마운트 지점에는 /mnt/storage
빠르게 증가하는 파일 수가 포함되며, 이 파일은 일괄적으로 하위 디렉터리로 이동되고 처리됩니다.
내 문제는 이동이 상대적으로 느리다는 것이고, 파일 테이블(파일이 하드 드라이브에 있는 정보만)만 변경할 수는 없기 때문에 걱정됩니다.
저는 현재 이것을 파이썬에서 사용하고 있지만 subprocess 를 shutil.move(src,dst)
사용하거나 사용하는 것도 고려하고 있습니다 .os.rename(src,dst)
mv
내 두려움이 맞나요? 그렇다면 방법이 있나요?보다 효율적으로 설치?
편집하다: 방금 문서를 다시 살펴보고 shutil.move()
다음 내용을 읽었습니다.
If the destination is on the current filesystem, then os.rename() is used.
Otherwise, src is copied (using shutil.copy2()) to dst and then removed.
이게 문제가 될 것 같긴 한데 그렇지 않다면"현재 파일 시스템에서", 내가 그런 사람인지 어떻게 알 수 있나요?"현재 파일 시스템에서"
편집 2: 내가 찾은 내용에 관심이 있는 사람이 있으면 stackoverflow에서 편집 내용을 복사하여 붙여넣기도 합니다.
다양한 이동 방법 간의 속도 차이를 테스트하기 위해 스크립트를 작성했습니다. 먼저 1x5GB( dd if=/dev/urandom of=/mnt/storage/source/test.file bs=100M count=50
)를 생성한 다음 100x5MB( for i in {1..100}; do dd if=/dev/urandom of=/mnt/storage/source/file$i bs=1M count=5
), 마지막으로 10000x5kB( for i in {1..100000}; do dd if=/dev/urandom of=/mnt/storage/source/file$i bs=1k count=5
) 를 생성합니다.
from shutil import move
from os import rename
from datetime import datetime
import subprocess
import os
print("Subprocess mv: for every file in directory..")
s = datetime.now()
for f in os.listdir("/mnt/storage/source/"):
try:
subprocess.call(["mv /mnt/storage/source/"+str(f)+" /mnt/storage/mv"],shell=True)
except Exception as e:
print(str(e))
e = datetime.now()
print("took {}".format(e-s)+"\n")
print("Subprocessmv : directory/*..")
s = datetime.now()
try:
subprocess.call(["mv /mnt/storage/mv/* /mnt/storage/mvf"],shell=True)
except Exception as e:
print(str(e))
e = datetime.now()
print("took {}".format(e-s)+"\n")
print("shutil.move: for every file file in directory..")
s = datetime.now()
for f in os.listdir("/mnt/storage/mvf/"):
try:
move("/mnt/storage/mvf/"+str(f),"/mnt/storage/move")
except Exception as e:
print(str(e))
e = datetime.now()
print("took {}".format(e-s)+"\n")
print("os.rename: for every file in directory..")
s = datetime.now()
for f in os.listdir("/mnt/storage/move/"):
try:
rename("/mnt/storage/move/"+str(f),"/mnt/storage/rename/"+str(f))
except Exception as e:
print(str(e))
e = datetime.now()
print("took {}".format(e-s)+"\n")
if os.path.isdir("/mnt/storage/rename_new"):
rmtree('/mnt/storage/rename_new')
print("os.rename & os.mkdir: rename source dir to destination & make new source dir..")
s = datetime.now()
rename("/mnt/storage/rename/","/mnt/storage/rename_new")
os.mkdir("/mnt/storage/rename/")
e = datetime.now()
print("took {}".format(e-s)+"\n")
이는 큰 차이가 없음을 보여줍니다. 5GB 파일은 매우 빠르게 이동했는데, 이는 파일 테이블을 변경하여 이동하는 것이 효과적임을 알려줍니다. 다음은 10000*5kB 파일에 대한 결과입니다(현재 네트워크 작업 부하에 따라 결과가 달라지는 것처럼 느껴집니다. 예를 들어 첫 번째 mv
테스트에는 2m 28s가 걸렸고 나중에는 동일한 파일을 사용하여 3m 22s가 걸렸으며 os.rename()
대부분의 경우 가장 빠른 방법이기도 합니다. .):
Subprocess mv: for every file in directory..
took 0:02:47.665174
Subprocessmv : directory/*..
took 0:01:40.087872
shutil.move: for every file file in directory..
took 0:01:48.454184
os.rename: for every file in directory..
rename took 0:02:05.597933
os.rename & os.mkdir: rename source dir to destination & make new source dir..
took 0:00:00.005704