Python многочастная загрузка. Создает больший файл в месте назначения - PullRequest
0 голосов
/ 20 января 2020

Я написал небольшой CLI в python для обработки нескольких загрузок на сервер flask. При тестировании процесса я обнаружил, что загружаемый файл размером 25 МБ создает файл размером 42 МБ на сервере после завершения ?! Каждый чанк почти удваивается, когда достигает сервера.

Код клиента CLI:

from requests_toolbelt.multipart.encoder import MultipartEncoder

#Open file
            with open(self.file_path, 'rb') as file:
                start = 0
                chunk_count = math.ceil(self.file_size / self.max_byte_length)
                print("Number of upload parts:", chunk_count)



                with alive_bar(chunk_count) as bar:
                    #for i in range(chunk_count):
                    while self.i < chunk_count:

                        if self.i >= chunk_count-1:
                            is_last_chunk = True

                        end = min(self.file_size, start + self.max_byte_length)
                        file.seek(start)
                        data = file.read(end)
                        start = end

                        print("Chunk size : {}".format(str(sys.getsizeof(data))))

                        multipart_data = MultipartEncoder(
                        fields={
                                # a file upload field
                                'data': data,
                                # plain text fields
                                'chunk_index': str(self.i+1),
                                'chunk_size' : str(sys.getsizeof(data)),
                                'chunk_count' : str(chunk_count),
                                'file_size' : str(self.file_size),
                                'resource_friendly_name': friendly_name,
                                'upload_id': str(self.upload_id)
                            }
                        )
                        # Set headers
                        headers = {
                        'Content-Type': multipart_data.content_type
                        }

                        #Make request to server
                        try:

                            response = requests.request("POST", self.api_url, headers=headers, data=multipart_data)


Размеры чанков, зарегистрированные клиентом CLI, следующие:

on 0: Chunk size : 5242913
on 1: Chunk size : 10485793
on 2: Chunk size : 14685268
on 3: Chunk size : 9442388
on 4: Chunk size : 4199508

Размеры чанков, регистрируемых сервером, следующие:

on 0: Chunk size : 10466998
on 1: Chunk size : 41801848
on 2: Chunk size : 29323520
on 3: Chunk size : 18865242
on 4: Chunk size : 8388424

Понятия не имею, почему размер каждого чанка так резко увеличивается?

1 Ответ

0 голосов
/ 23 января 2020
use:

data = file.read(end - start)

instead of:

data = file.read(end)

Это выберет точную часть файла, как требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...