├── .dockerignore ├── .gitignore ├── Dockerfile.final ├── Dockerfile.intermediate ├── LICENSE ├── README.md ├── app.py ├── benchmark ├── application-octet-stream_1073741824-bytes-with-2-hops.txt ├── application-octet-stream_1073741824-bytes.txt ├── application-octet-stream_2147483648-bytes-with-2-hops.txt ├── application-octet-stream_268435456-bytes-with-2-hops.txt ├── application-octet-stream_268435456-bytes.txt ├── application-octet-stream_536870912-bytes-with-2-hops.txt ├── application-octet-stream_536870912-bytes.txt ├── multipart-form-data_1073741972-bytes.txt ├── multipart-form-data_268435606-bytes.txt ├── multipart-form-data_536871062-bytes.txt └── multipart-form-data_536871062bytes.txt ├── check-files-integrity.sh ├── docker-benchmark ├── application-octet-stream_268435456-bytes.txt └── multipart-form-data_268435606-bytes.txt ├── docker-compose.yml ├── requirements.txt ├── uploader.py ├── uwsgi-final.ini └── uwsgi-intermediate.ini /.dockerignore: -------------------------------------------------------------------------------- 1 | ./*.txt 2 | !requirements.txt 3 | ./downloads/* -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /Dockerfile.final: -------------------------------------------------------------------------------- 1 | FROM python:3.6-slim 2 | 3 | RUN apt-get update && \ 4 | apt-get install -y \ 5 | gcc \ 6 | vim-tiny && \ 7 | pip install --upgrade pip 8 | 9 | COPY . /code 10 | WORKDIR /code 11 | RUN pip install -r requirements.txt 12 | 13 | ENV FLASK_APP=/code/app.py 14 | EXPOSE 5001 15 | 16 | CMD uwsgi --ini uwsgi-final.ini 17 | -------------------------------------------------------------------------------- /Dockerfile.intermediate: -------------------------------------------------------------------------------- 1 | FROM python:3.6-slim 2 | 3 | RUN apt-get update && \ 4 | apt-get install -y \ 5 | gcc \ 6 | vim-tiny && \ 7 | pip install --upgrade pip 8 | 9 | COPY . /code 10 | WORKDIR /code 11 | RUN pip install -r requirements.txt 12 | 13 | ENV FLASK_APP=/code/app.py 14 | EXPOSE 5000 15 | 16 | CMD uwsgi --ini uwsgi-intermediate.ini -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Diego 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Quick test of large file uploads from Python to Flask app 2 | 3 | Problem described in https://github.com/reanahub/reana-client/issues/302. 4 | 5 | ## Prerequisites 6 | 7 | Create a/some big file(s): 8 | 9 | ```console 10 | $ dd if=/dev/random of=2048MB-file.txt count=2048 bs=1048576 11 | $ ls -lh 2048MB-file.txt 12 | -rw-r--r-- 1 username staff 2.0G Jul 5 11:49 2048MB-file.txt 13 | ``` 14 | 15 | ## Local test 16 | 17 | ### Run the server locally with Flask 18 | 19 | Run the Flask application: 20 | 21 | ```console 22 | $ FLASK_ENV=development FLASK_APP=app.py flask run 23 | ... 24 | ``` 25 | 26 | ### Upload files of different sizes 27 | 28 | In a different window upload big files: 29 | 30 | ```console 31 | $ ls -lah *-file.txt 32 | -rw-r--r-- 1 rodrigdi staff 256M Oct 10 13:50 256MB-file.txt 33 | -rw-r--r-- 1 rodrigdi staff 512M Oct 10 13:53 512MB-file.txt 34 | -rw-r--r-- 1 rodrigdi staff 1.0G Oct 10 13:55 1GB-file.txt 35 | -rw-r--r-- 1 rodrigdi staff 2.0G Oct 10 13:59 2GB-file.txt 36 | $ python uploader.py [256MB|512MB|1024MB|2048MB]-file.txt \ 37 | -t [request.stream|request.files] \ 38 | --profile 39 | Uploading 512MB-file.txt using request.stream ... 40 | File 512MB-file.txt uploaded using request.stream. 41 | $ # Profiling output is written to ./benchmark 42 | $ ls ./benchmark/ 43 | application-octet-stream_2147483648bytes.txt 44 | application-octet-stream_1073741824-bytes.txt 45 | application-octet-stream_536870912-bytes.txt 46 | application-octet-stream_268435456-bytes.txt 47 | multipart-form-data_1073741972-bytes.txt 48 | multipart-form-data_536871062-bytes.txt 49 | multipart-form-data_268435606-bytes.txt 50 | ``` 51 | 52 | ## Passing file between Flask applications 53 | 54 | Start two applications (you will need to terminal sessions): 55 | ```console 56 | $ FLASK_ENV=development FLASK_APP=app flask run -p 5001 57 | ... 58 | $ FLASK_ENV=development FLASK_APP=app flask run -p 5000 59 | ... 60 | ``` 61 | 62 | In a another session stream upload a big file: 63 | ```console 64 | $ ipython 65 | with open('2GB-file.txt', 'rb') as f: 66 | requests.post('http://localhost:5000/stream-pass-to-next', 67 | headers={ 68 | 'Content-Type': 'application/octet-stream'}, 69 | params={'profile': True}, 70 | data=f) 71 | ``` 72 | 73 | ## Closer to production scenario: using Docker and `uwsgi` 74 | 75 | Build the server side application and run it in a different terminal session: 76 | 77 | ```console 78 | $ docker build . -t big-file-upload 79 | $ docker run -ti --rm -p 5000:5000 \ 80 | -v `pwd`/docker-benchmark:/code/benchmark \ 81 | big-file-upload 82 | ... 83 | ``` 84 | 85 | Upload the file from your host machine: 86 | 87 | ```console 88 | $ python uploader.py 2048MB-file.txt -t request.stream --profile 89 | Uploading 2048MB-file.txt using request.stream ... 90 | File 2048MB-file.txt uploaded using request.stream. 91 | $ python uploader.py 2048MB-file.txt -t request.files --profile 92 | Uploading 2048MB-file.txt using request.files ... 93 | File 2048MB-file.txt uploaded using request.files. 94 | ``` 95 | 96 | ## Conclusions 97 | 98 | Disclaimer: All this tests **do not take into account network overhead**. 99 | 100 | | File size | Method | Deployment | Time | 101 | | :-----------: |:----------------:| :------------: |:---------------:| 102 | | 256 MB | command `dd` | bash | 6.280 seconds | 103 | | 256 MB | `request.stream` | Flask | 5.196 seconds | 104 | | 256 MB | `request.files` | Flask | 20.431 seconds | 105 | | 256 MB | `request.stream` | uwsgi + Docker | 77.104 seconds | 106 | | 256 MB | `request.files` | uwsgi + Docker | 457.781 seconds | 107 | | 512 MB | command `dd` | bash | 12.307 seconds | 108 | | 512 MB | `request.stream` | Flask | 10.323 seconds | 109 | | 512 MB | `request.files` | Flask | 41.110 seconds | 110 | | 1 GB | command `dd` | bash | 24.582 seconds | 111 | | 1 GB | `request.stream` | Flask | 21.085 seconds | 112 | | 1 GB | `request.files` | Flask | 84.105 seconds | 113 | | 2 GB | command `dd` | bash | 49.426 seconds | 114 | | 2 GB | `request.stream` | Flask | 41.558 seconds | 115 | | 2 GB | `request.files` | Flask | **crashed** | 116 | 117 | Now, choosing `request.stream`, let's compare differences between: 118 | - **1 Hop**: sending the file to a Flask app and writing it directly to disk 119 | - **2 Hops**: sending the file to a Flask app, which streams it to another Flask app and writes it to disk 120 | 121 | | File size | Hops | Time | 122 | |:---------:|:----:|:--------------:| 123 | | 256MB | 1 | 5.196 seconds | 124 | | 256MB | 2 | 1.611 seconds | 125 | | 512MB | 1 | 10.323 seconds | 126 | | 512MB | 2 | 3.237 seconds | 127 | | 1GB | 1 | 21.085 seconds | 128 | | 1GB | 2 | 9.472 seconds | 129 | | 2GB | 1 | 41.558 seconds | 130 | | 2GB | 2 | 20.078 seconds | 131 | 132 | - The `request.files` upload type is taking 4 times the time `request.stream` takes 133 | 134 | - We can also observe that in the case of 135 | [`request.files` for a 1GB file](./benchmark/multipart-form-data_1073741972-bytes.txt) most of the time is spent in 136 | 137 | ``` 138 | 2 9.804 4.902 78.880 39.440 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:531(parse_parts) 139 | ``` 140 | 141 | This is because `werkzeug` [writes to a tempfile any file bigger that 500KB](https://github.com/pallets/werkzeug/blob/e7ba08f209477cb453f15113f9a4d527a6e81bfe/src/werkzeug/formparser.py#L53-L62). 142 | 143 | - There is clearly something that needs to be improved regarding `uwsgi` 144 | configuration. 145 | 146 | - Looks like the 2 hops setup is roughly 2x faster. Since this is suspicious, you can check the file integrity (original file versus uploaded file) like follows: 147 | ```console 148 | $ bash check-files-integrity.sh 149 | Removing existing files and downloads ... 150 | Re-creating new files of sizes: 256MB 512MB 1024MB 2048MB 151 | 256+0 records in 152 | 256+0 records out 153 | 268435456 bytes transferred in 6.280994 secs (42737735 bytes/sec) 154 | Original file 256MB-file.txt created. 155 | 512+0 records in 156 | 512+0 records out 157 | 536870912 bytes transferred in 12.307863 secs (43620157 bytes/sec) 158 | Original file 512MB-file.txt created. 159 | 1024+0 records in 160 | 1024+0 records out 161 | 1073741824 bytes transferred in 24.582782 secs (43678613 bytes/sec) 162 | Original file 1024MB-file.txt created. 163 | 2048+0 records in 164 | 2048+0 records out 165 | 2147483648 bytes transferred in 49.426168 secs (43448314 bytes/sec) 166 | Original file 2048MB-file.txt created. 167 | Uploading 256MB file ... 168 | Uploading 512MB file ... 169 | Uploading 1024MB file ... 170 | Uploading 2048MB file ... 171 | md5(downloads/256MB_0de0d949-6acd-46d2-b02c-aaf86112ba37) -> 76b422e5e525096c2e9c3844e6ae49c0 172 | md5(256MB-file.txt) -> 76b422e5e525096c2e9c3844e6ae49c0 173 | 256MB - 0 174 | md5(downloads/512MB_3d6d1acf-6e0c-4799-ad42-9f04f2bde831) -> cf47f19ab9d2e7073741aa4d474e58c2 175 | md5(512MB-file.txt) -> cf47f19ab9d2e7073741aa4d474e58c2 176 | 512MB - 0 177 | md5(downloads/1024MB_4242840a-7289-442b-bb55-978a261b9ba1) -> d3d36b9aba3bbd812955983159deb2ed 178 | md5(1024MB-file.txt) -> d3d36b9aba3bbd812955983159deb2ed 179 | 1024MB - 0 180 | md5(downloads/2048MB_207b0f69-5971-493e-b52a-0bcc9b076393) -> 2d16f591080ba0fb397743ef8cdbb399 181 | md5(2048MB-file.txt) -> 2d16f591080ba0fb397743ef8cdbb399 182 | 2048MB - 0 183 | ``` 184 | 185 | ## **Next** 186 | 187 | **On the client side**: Use streaming upload with Requests [as stated in Requests docs](https://requests.kennethreitz.org//en/v1.1.0/user/advanced/#streaming-uploads) with `application/octet-stream` content type: 188 | 189 | ```python 190 | with open(big_file, 'r') as f: 191 | request.post('http://localhost/upload-endpoint', data=f, 192 | headers={'Content-Type': 'application/octet-stream'}) 193 | ``` 194 | 195 | **On the server side**: Use `request.stream` object: 196 | ```python 197 | with open(path_to_new_file, 'w') as f: 198 | f.writelines(request.stream) 199 | ``` 200 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | """.""" 2 | import logging 3 | import os 4 | from functools import wraps 5 | from uuid import uuid4 6 | 7 | import requests 8 | from flask import Flask, jsonify, request 9 | from werkzeug.datastructures import FileStorage 10 | from memory_profiler import profile as mem_profile 11 | 12 | app = Flask(__name__) 13 | app.secret_key = 'secret-key' 14 | 15 | RESULTS_FOLDER = os.getenv('BIG_FILE_UPLOAD_RESULTS_FOLDER', 16 | os.path.join(os.path.dirname(__file__), 17 | 'benchmark')) 18 | """Where to store benchmarking files.""" 19 | 20 | os.makedirs(RESULTS_FOLDER, exist_ok=True) 21 | 22 | 23 | def profile(f): 24 | """Add option to memory profile endpoint.""" 25 | @wraps(f) 26 | def func(*args, **kwargs): 27 | profile = request.args.get('profile', False, type=bool) 28 | if profile: 29 | import tracemalloc 30 | import cProfile 31 | import pstats 32 | pr = cProfile.Profile() 33 | pr.enable() 34 | tracemalloc.start() 35 | 36 | to_return = f(*args, **kwargs) 37 | 38 | if profile: 39 | file_size = request.headers.get('Content-Length', 'size-not-known') 40 | upload_type = request.headers.get('Content-Type' 41 | ).split(';')[0].replace('/', '-') 42 | benchmark_file = f'{upload_type}_{file_size}-bytes.txt' 43 | with open(os.path.join(RESULTS_FOLDER, benchmark_file), 'w') as ff: 44 | pr.disable() 45 | sortby = 'cumulative' 46 | ff.write('######## Time and calls profiling. ########\n') 47 | ps = pstats.Stats(pr, stream=ff).sort_stats(sortby) 48 | ps.print_stats() 49 | ff.write('######## Memory profiling. ########\n') 50 | snapshot = tracemalloc.take_snapshot() 51 | top_stats = snapshot.statistics('lineno') 52 | ff.write("[ Top 10 ]\n") 53 | for stat in top_stats[:10]: 54 | ff.write(f'{stat}\n') 55 | return to_return 56 | return func 57 | 58 | 59 | def write_file_stream_to_dev_null(stream): 60 | """Write file stream to dev null.""" 61 | try: 62 | with open(os.devnull, 'wb') as saved_file: 63 | saved_file.writelines(stream) 64 | return jsonify({'msg': 'File saved'}) 65 | except Exception as e: 66 | return jsonify({'msg': 'something went wrong while writing file'}) 67 | logging.error(e.msg, exc_info=True) 68 | 69 | 70 | @mem_profile 71 | def write_file_stream_to_current_dir_with_filestorage(stream): 72 | """Write file stream to dev null.""" 73 | download_dir = os.path.join(os.path.dirname(__file__), 74 | 'downloads') 75 | os.makedirs(download_dir, exist_ok=True) 76 | file_size_in_mb = int(stream.limit/1024/1024) 77 | filename = f'{file_size_in_mb}MB_{str(uuid4())}' 78 | file_path = os.path.join(download_dir, filename) 79 | try: 80 | filestorage = FileStorage(stream) 81 | filestorage.save(file_path, buffer_size=10485760) 82 | return jsonify({'msg': 'File saved'}) 83 | except Exception as e: 84 | return jsonify({'msg': 'something went wrong while writing file'}) 85 | logging.error(e.msg, exc_info=True) 86 | 87 | 88 | @mem_profile 89 | def write_file_stream_to_current_dir_with_shutil(stream): 90 | """Write file stream to dev null.""" 91 | download_dir = os.path.join(os.path.dirname(__file__), 92 | 'downloads') 93 | os.makedirs(download_dir, exist_ok=True) 94 | file_size_in_mb = int(stream.limit/1024/1024) 95 | filename = f'{file_size_in_mb}MB_{str(uuid4())}' 96 | file_path = os.path.join(download_dir, filename) 97 | try: 98 | import shutil 99 | with open(file_path, 'wb') as dest: 100 | shutil.copyfileobj(stream, dest, length=10485760) 101 | return jsonify({'msg': 'File saved'}) 102 | except Exception as e: 103 | return jsonify({'msg': 'something went wrong while writing file'}) 104 | logging.error(e.msg, exc_info=True) 105 | 106 | @mem_profile 107 | def write_file_stream_to_current_dir(stream): 108 | """Write file stream to dev null.""" 109 | download_dir = os.path.join(os.path.dirname(__file__), 110 | 'downloads') 111 | os.makedirs(download_dir, exist_ok=True) 112 | file_size_in_mb = int(stream.limit/1024/1024) 113 | filename = f'{file_size_in_mb}MB_{str(uuid4())}' 114 | file_path = os.path.join(download_dir, filename) 115 | try: 116 | with open(file_path, 'wb') as saved_file: 117 | saved_file.writelines(stream) 118 | return jsonify({'msg': 'File saved'}) 119 | except Exception as e: 120 | return jsonify({'msg': 'something went wrong while writing file'}) 121 | logging.error(e.msg, exc_info=True) 122 | 123 | 124 | @app.route('/request-files', methods=['POST']) 125 | @profile 126 | def upload_request_files(): 127 | """Upload file reading from ``request.files``. 128 | 129 | This is the way we currently implement file uploads because it is the only 130 | supported way by Bravado, using form data files (more here 131 | https://github.com/Yelp/bravado/issues/291). 132 | 133 | This is not performant because Werkzeug preprocesses form data ( 134 | https://github.com/pallets/werkzeug/blob/f7374b6bbadefc073def6a2fed85c33784ff1abc/src/werkzeug/formparser.py#L65any) 135 | and any file bigger than 500 KB is writen to a temporary file, 136 | more info here 137 | https://github.com/pallets/werkzeug/blob/f7374b6bbadefc073def6a2fed85c33784ff1abc/src/werkzeug/formparser.py#L53. 138 | """ 139 | return write_file_stream_to_dev_null(request.files['file']) 140 | 141 | 142 | @app.route('/request-stream', methods=['POST']) 143 | @profile 144 | def upload_request_stream(): 145 | """Upload file reading directly from ``request.stream``. 146 | 147 | This method used the ``werkzeug.wsgi.LimitedStream``, 148 | more here https://werkzeug.palletsprojects.com/en/0.15.x/wsgi/#werkzeug.wsgi.LimitedStream, 149 | which doesn't write any temporary file or to memory, it just directly reads 150 | from the incoming stream. 151 | """ 152 | return write_file_stream_to_current_dir_with_shutil(request.stream) 153 | 154 | 155 | @app.route('/stream-pass-to-next', methods=['POST']) 156 | @profile 157 | def stream_pass_to_next(): 158 | """Mock passing file between "microservices".""" 159 | next = request.args.get('next', 'localhost:5001') 160 | 161 | class WrappedLimitedStream(object): 162 | def __init__(self, limitedstream): 163 | self.limitedstream = limitedstream 164 | 165 | def read(self, *args, **kwargs): 166 | return self.limitedstream.read(*args, **kwargs) 167 | 168 | def __len__(self): 169 | return self.limitedstream.limit 170 | 171 | requests.post(f'http://{next}/request-stream', 172 | data=WrappedLimitedStream(request.stream), 173 | headers={'Content-Type': 'application/octet-stream'}) 174 | return jsonify({'msg': 'File uploaded'}) 175 | -------------------------------------------------------------------------------- /benchmark/application-octet-stream_1073741824-bytes.txt: -------------------------------------------------------------------------------- 1 | ######## Time and calls profiling. ######## 2 | 17414856 function calls in 21.085 seconds 3 | 4 | Ordered by: cumulative time 5 | 6 | ncalls tottime percall cumtime percall filename:lineno(function) 7 | 1 0.000 0.000 21.084 21.084 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:96(upload_request_stream) 8 | 1 0.000 0.000 21.084 21.084 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:61(write_file_stream_to_dev_null) 9 | 1 3.186 3.186 21.084 21.084 {method 'writelines' of '_io._IOBase' objects} 10 | 4189810 1.993 0.000 17.898 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:993(__next__) 11 | 4189810 5.788 0.000 15.905 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:947(readline) 12 | 4189809 7.792 0.000 9.305 0.000 {method 'readline' of '_io.BufferedReader' objects} 13 | 131072 0.135 0.000 1.512 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:572(readinto) 14 | 131072 0.931 0.000 0.931 0.000 {method 'recv_into' of '_socket.socket' objects} 15 | 4189811 0.813 0.000 0.813 0.000 {built-in method builtins.len} 16 | 131072 0.061 0.000 0.253 0.000 {method '_checkReadable' of '_io._IOBase' objects} 17 | 131072 0.193 0.000 0.193 0.000 {method '_checkClosed' of '_io._IOBase' objects} 18 | 131072 0.193 0.000 0.193 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:611(readable) 19 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:306(jsonify) 20 | 2 0.000 0.000 0.000 0.000 {built-in method io.open} 21 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:188(dumps) 22 | 12 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:345(__getattr__) 23 | 14 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:301(_get_current_object) 24 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py:183(dumps) 25 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:182(encode) 26 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:173(__init__) 27 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:111(_dump_arg_defaults) 28 | 14 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:163(top) 29 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:412(_iterencode) 30 | 17 0.000 0.000 0.000 0.000 {built-in method builtins.getattr} 31 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:333(_iterencode_dict) 32 | 9 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:49(_find_app) 33 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1247(__setitem__) 34 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:85(__get__) 35 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:35(_lookup_req_object) 36 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1199(set) 37 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:343(set_data) 38 | 14 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr} 39 | 14 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:70(__getattr__) 40 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:204(iterencode) 41 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:361(stream) 42 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:327(__bool__) 43 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:988(get) 44 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1367(__getitem__) 45 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:202(get_input_stream) 46 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.sorted} 47 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:75(join) 48 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:266(get_content_type) 49 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/_bootlocale.py:23(getpreferredencoding) 50 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:182(get_content_length) 51 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:894(on_exhausted) 52 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:292(_set_status_code) 53 | 6 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:911(_unicodify_header_value) 54 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:259(_make_iterencode) 55 | 3 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects} 56 | 33 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 57 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:527(headers) 58 | 14 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident} 59 | 1 0.000 0.000 0.000 0.000 {built-in method _locale.nl_langinfo} 60 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:880(__init__) 61 | 1 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects} 62 | 2 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects} 63 | 1 0.000 0.000 0.000 0.000 {method 'read' of '_io.BufferedReader' objects} 64 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/codecs.py:185(__init__) 65 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:104(__init__) 66 | 2 0.000 0.000 0.000 0.000 {built-in method _json.encode_basestring_ascii} 67 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1178(_validate_value) 68 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:81(blueprint) 69 | 2 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} 70 | 7 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} 71 | 1 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects} 72 | 1 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects} 73 | 2 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} 74 | 3 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects} 75 | 2 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects} 76 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.id} 77 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.max} 78 | 1 0.000 0.000 0.000 0.000 {built-in method posix.fspath} 79 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:41(_get_sep) 80 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:353() 81 | 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 82 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:953(__init__) 83 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/app.py:867(debug) 84 | 2 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} 85 | 1 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} 86 | 1 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects} 87 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.iter} 88 | 1 0.000 0.000 0.000 0.000 {built-in method _tracemalloc.start} 89 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1359(__init__) 90 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:690(_assert_not_shallow) 91 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:886(__iter__) 92 | 93 | 94 | ######## Memory profiling. ######## 95 | [ Top 10 ] 96 | /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/urls.py:399: size=36.5 KiB, count=3, average=12.2 KiB 97 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tracemalloc.py:65: size=36.4 KiB, count=517, average=72 B 98 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:65: size=25.0 KiB, count=229, average=112 B 99 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:87: size=22.5 KiB, count=282, average=82 B 100 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:218: size=21.1 KiB, count=180, average=120 B 101 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:67: size=17.8 KiB, count=183, average=100 B 102 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:55: size=12.6 KiB, count=446, average=29 B 103 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:250: size=9376 B, count=9, average=1042 B 104 | /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:45: size=4830 B, count=8, average=604 B 105 | /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/_reloader.py:21: size=4600 B, count=22, average=209 B 106 | -------------------------------------------------------------------------------- /benchmark/application-octet-stream_268435456-bytes.txt: -------------------------------------------------------------------------------- 1 | ######## Time and calls profiling. ######## 2 | 4356712 function calls in 5.196 seconds 3 | 4 | Ordered by: cumulative time 5 | 6 | ncalls tottime percall cumtime percall filename:lineno(function) 7 | 1 0.000 0.000 5.195 5.195 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:96(upload_request_stream) 8 | 1 0.000 0.000 5.194 5.194 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:61(write_file_stream_to_dev_null) 9 | 1 0.776 0.776 5.194 5.194 {method 'writelines' of '_io._IOBase' objects} 10 | 1048154 0.489 0.000 4.418 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:993(__next__) 11 | 1048154 1.407 0.000 3.928 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:947(readline) 12 | 1048153 1.943 0.000 2.317 0.000 {method 'readline' of '_io.BufferedReader' objects} 13 | 32768 0.032 0.000 0.374 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:572(readinto) 14 | 32768 0.232 0.000 0.232 0.000 {method 'recv_into' of '_socket.socket' objects} 15 | 1048155 0.204 0.000 0.204 0.000 {built-in method builtins.len} 16 | 32768 0.014 0.000 0.062 0.000 {method '_checkReadable' of '_io._IOBase' objects} 17 | 32768 0.048 0.000 0.048 0.000 {method '_checkClosed' of '_io._IOBase' objects} 18 | 32768 0.048 0.000 0.048 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:611(readable) 19 | 2 0.001 0.000 0.001 0.000 {built-in method io.open} 20 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:306(jsonify) 21 | 12 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:345(__getattr__) 22 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:188(dumps) 23 | 14 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:301(_get_current_object) 24 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:173(__init__) 25 | 17 0.000 0.000 0.000 0.000 {built-in method builtins.getattr} 26 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py:183(dumps) 27 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:85(__get__) 28 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:182(encode) 29 | 14 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:163(top) 30 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:111(_dump_arg_defaults) 31 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:35(_lookup_req_object) 32 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:361(stream) 33 | 14 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:70(__getattr__) 34 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:202(get_input_stream) 35 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:412(_iterencode) 36 | 9 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:49(_find_app) 37 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1247(__setitem__) 38 | 14 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr} 39 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:333(_iterencode_dict) 40 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:343(set_data) 41 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1199(set) 42 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:204(iterencode) 43 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:988(get) 44 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1367(__getitem__) 45 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:75(join) 46 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:327(__bool__) 47 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/_bootlocale.py:23(getpreferredencoding) 48 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:182(get_content_length) 49 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:266(get_content_type) 50 | 33 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 51 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:259(_make_iterencode) 52 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:894(on_exhausted) 53 | 14 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident} 54 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:880(__init__) 55 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:292(_set_status_code) 56 | 1 0.000 0.000 0.000 0.000 {built-in method _locale.nl_langinfo} 57 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.sorted} 58 | 6 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:911(_unicodify_header_value) 59 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:527(headers) 60 | 3 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects} 61 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:104(__init__) 62 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:953(__init__) 63 | 7 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} 64 | 1 0.000 0.000 0.000 0.000 {method 'read' of '_io.BufferedReader' objects} 65 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1178(_validate_value) 66 | 1 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects} 67 | 3 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects} 68 | 2 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects} 69 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/codecs.py:185(__init__) 70 | 2 0.000 0.000 0.000 0.000 {built-in method _json.encode_basestring_ascii} 71 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:690(_assert_not_shallow) 72 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:81(blueprint) 73 | 2 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} 74 | 1 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} 75 | 1 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects} 76 | 1 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects} 77 | 2 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} 78 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.max} 79 | 1 0.000 0.000 0.000 0.000 {built-in method posix.fspath} 80 | 1 0.000 0.000 0.000 0.000 {built-in method _tracemalloc.start} 81 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:41(_get_sep) 82 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1359(__init__) 83 | 2 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} 84 | 1 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects} 85 | 2 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects} 86 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.id} 87 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.iter} 88 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:353() 89 | 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 90 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:886(__iter__) 91 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/app.py:867(debug) 92 | 93 | 94 | ######## Memory profiling. ######## 95 | [ Top 10 ] 96 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:65: size=19.3 KiB, count=165, average=120 B 97 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:218: size=9720 B, count=81, average=120 B 98 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:67: size=9512 B, count=84, average=113 B 99 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:55: size=9480 B, count=392, average=24 B 100 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:87: size=8336 B, count=98, average=85 B 101 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:119: size=8008 B, count=143, average=56 B 102 | /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:45: size=4830 B, count=8, average=604 B 103 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:435: size=3939 B, count=28, average=141 B 104 | /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:956: size=3463 B, count=97, average=36 B 105 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:436: size=2519 B, count=27, average=93 B 106 | -------------------------------------------------------------------------------- /benchmark/application-octet-stream_536870912-bytes.txt: -------------------------------------------------------------------------------- 1 | ######## Time and calls profiling. ######## 2 | 8708748 function calls in 10.323 seconds 3 | 4 | Ordered by: cumulative time 5 | 6 | ncalls tottime percall cumtime percall filename:lineno(function) 7 | 1 0.000 0.000 10.323 10.323 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:96(upload_request_stream) 8 | 1 0.000 0.000 10.323 10.323 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:61(write_file_stream_to_dev_null) 9 | 1 1.557 1.557 10.322 10.322 {method 'writelines' of '_io._IOBase' objects} 10 | 2095203 0.981 0.000 8.765 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:993(__next__) 11 | 2095203 2.843 0.000 7.785 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:947(readline) 12 | 2095202 3.812 0.000 4.545 0.000 {method 'readline' of '_io.BufferedReader' objects} 13 | 65536 0.067 0.000 0.733 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:572(readinto) 14 | 65536 0.448 0.000 0.448 0.000 {method 'recv_into' of '_socket.socket' objects} 15 | 2095204 0.396 0.000 0.396 0.000 {built-in method builtins.len} 16 | 65536 0.030 0.000 0.123 0.000 {method '_checkReadable' of '_io._IOBase' objects} 17 | 65536 0.095 0.000 0.095 0.000 {method '_checkClosed' of '_io._IOBase' objects} 18 | 65536 0.094 0.000 0.094 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:611(readable) 19 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:306(jsonify) 20 | 2 0.000 0.000 0.000 0.000 {built-in method io.open} 21 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:188(dumps) 22 | 12 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:345(__getattr__) 23 | 14 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:301(_get_current_object) 24 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py:183(dumps) 25 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:182(encode) 26 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:173(__init__) 27 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:111(_dump_arg_defaults) 28 | 17 0.000 0.000 0.000 0.000 {built-in method builtins.getattr} 29 | 14 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:163(top) 30 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:412(_iterencode) 31 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:85(__get__) 32 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:333(_iterencode_dict) 33 | 9 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:49(_find_app) 34 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:35(_lookup_req_object) 35 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1247(__setitem__) 36 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1199(set) 37 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:343(set_data) 38 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:361(stream) 39 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:202(get_input_stream) 40 | 14 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:70(__getattr__) 41 | 14 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr} 42 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:204(iterencode) 43 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:327(__bool__) 44 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:988(get) 45 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.sorted} 46 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:75(join) 47 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1367(__getitem__) 48 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:182(get_content_length) 49 | 33 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 50 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/_bootlocale.py:23(getpreferredencoding) 51 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:266(get_content_type) 52 | 14 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident} 53 | 6 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:911(_unicodify_header_value) 54 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:894(on_exhausted) 55 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:292(_set_status_code) 56 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:259(_make_iterencode) 57 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:880(__init__) 58 | 1 0.000 0.000 0.000 0.000 {built-in method _locale.nl_langinfo} 59 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:527(headers) 60 | 3 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects} 61 | 2 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} 62 | 3 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects} 63 | 2 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects} 64 | 1 0.000 0.000 0.000 0.000 {method 'read' of '_io.BufferedReader' objects} 65 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/codecs.py:185(__init__) 66 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:104(__init__) 67 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:81(blueprint) 68 | 2 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} 69 | 7 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} 70 | 2 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} 71 | 1 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects} 72 | 1 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects} 73 | 2 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects} 74 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.iter} 75 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.max} 76 | 1 0.000 0.000 0.000 0.000 {built-in method _tracemalloc.start} 77 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:41(_get_sep) 78 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:953(__init__) 79 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1178(_validate_value) 80 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1359(__init__) 81 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/app.py:867(debug) 82 | 1 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} 83 | 1 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects} 84 | 1 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects} 85 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.id} 86 | 1 0.000 0.000 0.000 0.000 {built-in method posix.fspath} 87 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:353() 88 | 2 0.000 0.000 0.000 0.000 {built-in method _json.encode_basestring_ascii} 89 | 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 90 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:690(_assert_not_shallow) 91 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:886(__iter__) 92 | 93 | 94 | ######## Memory profiling. ######## 95 | [ Top 10 ] 96 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tracemalloc.py:65: size=39.9 KiB, count=568, average=72 B 97 | /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/urls.py:399: size=36.5 KiB, count=3, average=12.2 KiB 98 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:65: size=24.7 KiB, count=224, average=113 B 99 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:87: size=22.5 KiB, count=282, average=82 B 100 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:218: size=21.1 KiB, count=180, average=120 B 101 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:67: size=17.8 KiB, count=183, average=100 B 102 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:55: size=12.7 KiB, count=448, average=29 B 103 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:250: size=9080 B, count=7, average=1297 B 104 | /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:45: size=4830 B, count=8, average=604 B 105 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:435: size=3898 B, count=27, average=144 B 106 | -------------------------------------------------------------------------------- /benchmark/multipart-form-data_1073741972-bytes.txt: -------------------------------------------------------------------------------- 1 | ######## Time and calls profiling. ######## 2 | 109171082 function calls (109171073 primitive calls) in 84.105 seconds 3 | 4 | Ordered by: cumulative time 5 | 6 | ncalls tottime percall cumtime percall filename:lineno(function) 7 | 1 0.000 0.000 84.105 84.105 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:78(upload_request_files) 8 | 14/12 0.000 0.000 78.881 6.573 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:345(__getattr__) 9 | 22/17 0.000 0.000 78.880 4.640 {built-in method builtins.getattr} 10 | 5/3 0.000 0.000 78.880 26.293 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:85(__get__) 11 | 1 0.000 0.000 78.880 78.880 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:493(files) 12 | 1 0.000 0.000 78.880 78.880 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:87(_load_form_data) 13 | 1 0.000 0.000 78.880 78.880 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:297(_load_form_data) 14 | 1 0.000 0.000 78.880 78.880 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:209(parse) 15 | 1 0.000 0.000 78.880 78.880 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:129(wrapper) 16 | 1 0.000 0.000 78.880 78.880 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:239(_parse_multipart) 17 | 1 0.000 0.000 78.880 78.880 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:578(parse) 18 | 2 0.000 0.000 78.880 39.440 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:404(__init__) 19 | 1 0.000 0.000 78.880 78.880 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:582() 20 | 2 9.804 4.902 78.880 39.440 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:531(parse_parts) 21 | 16733832 15.536 0.000 49.993 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:427(parse_lines) 22 | 8366920 2.392 0.000 34.457 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:687(make_line_iter) 23 | 8366920 23.062 0.000 32.065 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:733(_iter_basic_lines) 24 | 16733829 8.329 0.000 19.083 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:766(write) 25 | 16725831 8.521 0.000 8.521 0.000 {method 'write' of '_io.BufferedRandom' objects} 26 | 1 0.000 0.000 5.224 5.224 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:61(write_file_stream_to_dev_null) 27 | 1 5.224 5.224 5.224 5.224 {method 'writelines' of '_io._IOBase' objects} 28 | 16385 3.301 0.000 3.301 0.000 {method 'splitlines' of 'bytes' objects} 29 | 8399459 2.574 0.000 2.574 0.000 {method 'append' of 'list' objects} 30 | 16733829 2.227 0.000 2.231 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:655(_check) 31 | 8448487 1.218 0.000 1.218 0.000 {built-in method builtins.len} 32 | 16388 0.014 0.000 1.073 0.000 {built-in method builtins.next} 33 | 16386 0.019 0.000 1.058 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:666(_make_chunk_iter) 34 | 16386 0.098 0.000 1.039 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:928(read) 35 | 16386 0.170 0.000 0.898 0.000 {method 'read' of '_io.BufferedReader' objects} 36 | 8383181 0.853 0.000 0.853 0.000 {method 'join' of 'bytes' objects} 37 | 32768 0.056 0.000 0.727 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:572(readinto) 38 | 32768 0.520 0.000 0.520 0.000 {method 'recv_into' of '_socket.socket' objects} 39 | 32768 0.025 0.000 0.083 0.000 {method '_checkReadable' of '_io._IOBase' objects} 40 | 32768 0.069 0.000 0.069 0.000 {method '_checkClosed' of '_io._IOBase' objects} 41 | 32768 0.058 0.000 0.058 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:611(readable) 42 | 16385 0.027 0.000 0.027 0.000 {built-in method builtins.min} 43 | 8000 0.003 0.000 0.003 0.000 {method 'tell' of '_io.BytesIO' objects} 44 | 7999 0.002 0.000 0.002 0.000 {method 'write' of '_io.BytesIO' objects} 45 | 1 0.000 0.000 0.001 0.001 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:363(_find_terminator) 46 | 1 0.000 0.000 0.001 0.001 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:661(rollover) 47 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:573(TemporaryFile) 48 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:306(jsonify) 49 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:251(_mkstemp_inner) 50 | 3 0.000 0.000 0.000 0.000 {built-in method io.open} 51 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:188(dumps) 52 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:301(_get_current_object) 53 | 131 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects} 54 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/http.py:378(parse_options_header) 55 | 1 0.000 0.000 0.000 0.000 {built-in method posix.open} 56 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py:183(dumps) 57 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:291(parse_multipart_headers) 58 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:163(top) 59 | 13 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:49(_find_app) 60 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:182(encode) 61 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:157(__next__) 62 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:111(_dump_arg_defaults) 63 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:173(__init__) 64 | 1 0.000 0.000 0.000 0.000 {built-in method posix.unlink} 65 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:395(start_file_streaming) 66 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:412(_iterencode) 67 | 4 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:327(__bool__) 68 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:988(get) 69 | 4 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:961(__getitem__) 70 | 7 0.000 0.000 0.000 0.000 {method 'match' of '_sre.SRE_Pattern' objects} 71 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:333(_iterencode_dict) 72 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:160() 73 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:70(__getattr__) 74 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:282(make_form_data_parser) 75 | 20 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr} 76 | 8 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/random.py:255(choice) 77 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:953(__init__) 78 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/common_descriptors.py:99(mimetype) 79 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:369(abspath) 80 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:75(join) 81 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/common_descriptors.py:93(_parse_content_type) 82 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:65(max_content_length) 83 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:35(_lookup_req_object) 84 | 8 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/random.py:223(_randbelow) 85 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:332(_get_stream_for_parsing) 86 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:331(normpath) 87 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1247(__setitem__) 88 | 2 0.000 0.000 0.000 0.000 {method 'seek' of '_io.BufferedRandom' objects} 89 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:343(set_data) 90 | 18 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident} 91 | 54 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 92 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:204(iterencode) 93 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:748(seek) 94 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1199(set) 95 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:361(stream) 96 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.sorted} 97 | 8 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/http.py:235(unquote_header_value) 98 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:202(get_input_stream) 99 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:244(_get_file_stream) 100 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:379(get_part_encoding) 101 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:182(get_content_length) 102 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/exceptions.py:109(__init__) 103 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/_compat.py:204(to_native) 104 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1367(__getitem__) 105 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:53(default_stream_factory) 106 | 3 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects} 107 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/_bootlocale.py:23(getpreferredencoding) 108 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:118(_sanitize_params) 109 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:146(rng) 110 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:2831(__iter__) 111 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:292(_set_status_code) 112 | 10 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects} 113 | 11 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} 114 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:41(_get_sep) 115 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:638(__init__) 116 | 5 0.000 0.000 0.000 0.000 {built-in method posix.fspath} 117 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:64(isabs) 118 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:259(_make_iterencode) 119 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:880(__init__) 120 | 6 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects} 121 | 2 0.000 0.000 0.000 0.000 {built-in method builtins.iter} 122 | 6 0.000 0.000 0.000 0.000 {method 'group' of '_sre.SRE_Match' objects} 123 | 4 0.000 0.000 0.000 0.000 {method 'groups' of '_sre.SRE_Match' objects} 124 | 1 0.000 0.000 0.000 0.000 {built-in method itertools.tee} 125 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/exceptions.py:80(__init__) 126 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:266(get_content_type) 127 | 6 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:911(_unicodify_header_value) 128 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:527(headers) 129 | 18 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} 130 | 3 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} 131 | 3 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects} 132 | 13 0.000 0.000 0.000 0.000 {method 'getrandbits' of '_random.Random' objects} 133 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:97(_infer_return_type) 134 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:431(__getitem__) 135 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:280(_line_parse) 136 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:328(__init__) 137 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:894(on_exhausted) 138 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/app.py:867(debug) 139 | 2 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects} 140 | 1 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects} 141 | 2 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects} 142 | 2 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects} 143 | 3 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects} 144 | 2 0.000 0.000 0.000 0.000 {built-in method builtins.max} 145 | 1 0.000 0.000 0.000 0.000 {built-in method posix.getpid} 146 | 1 0.000 0.000 0.000 0.000 {built-in method _locale.nl_langinfo} 147 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/codecs.py:185(__init__) 148 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:104(__init__) 149 | 2 0.000 0.000 0.000 0.000 {built-in method _json.encode_basestring_ascii} 150 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:687(__iter__) 151 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/_compat.py:166(make_literal_wrapper) 152 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:273(want_form_data_parsed) 153 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:2708(__init__) 154 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:173(__init__) 155 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:354(_fix_ie_filename) 156 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:81(blueprint) 157 | 1 0.000 0.000 0.000 0.000 {method 'strip' of 'bytes' objects} 158 | 8 0.000 0.000 0.000 0.000 {method 'bit_length' of 'int' objects} 159 | 1 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects} 160 | 3 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects} 161 | 4 0.000 0.000 0.000 0.000 {method 'end' of '_sre.SRE_Match' objects} 162 | 1 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects} 163 | 1 0.000 0.000 0.000 0.000 {built-in method _tracemalloc.start} 164 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:353() 165 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:237(_get_candidate_names) 166 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:291(gettempdir) 167 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1178(_validate_value) 168 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1359(__init__) 169 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:195(get_parse_func) 170 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:913(exhaust) 171 | 1 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} 172 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.id} 173 | 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 174 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:690(_assert_not_shallow) 175 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:583() 176 | 177 | 178 | ######## Memory profiling. ######## 179 | [ Top 10 ] 180 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:65: size=46.4 KiB, count=415, average=115 B 181 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tracemalloc.py:65: size=40.1 KiB, count=571, average=72 B 182 | /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/urls.py:399: size=36.5 KiB, count=3, average=12.2 KiB 183 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:55: size=25.9 KiB, count=974, average=27 B 184 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:87: size=23.4 KiB, count=285, average=84 B 185 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:218: size=21.1 KiB, count=180, average=120 B 186 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:67: size=20.2 KiB, count=183, average=113 B 187 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:250: size=9672 B, count=11, average=879 B 188 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:435: size=7482 B, count=51, average=147 B 189 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:436: size=5736 B, count=51, average=112 B 190 | -------------------------------------------------------------------------------- /benchmark/multipart-form-data_268435606-bytes.txt: -------------------------------------------------------------------------------- 1 | ######## Time and calls profiling. ######## 2 | 27302871 function calls (27302861 primitive calls) in 20.431 seconds 3 | 4 | Ordered by: cumulative time 5 | 6 | ncalls tottime percall cumtime percall filename:lineno(function) 7 | 1 0.000 0.000 20.430 20.430 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:78(upload_request_files) 8 | 14/12 0.000 0.000 19.244 1.604 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:345(__getattr__) 9 | 23/17 0.000 0.000 19.244 1.132 {built-in method builtins.getattr} 10 | 5/3 0.000 0.000 19.244 6.415 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:85(__get__) 11 | 1 0.000 0.000 19.244 19.244 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:493(files) 12 | 1 0.000 0.000 19.244 19.244 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:87(_load_form_data) 13 | 1 0.000 0.000 19.244 19.244 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:297(_load_form_data) 14 | 1 0.000 0.000 19.244 19.244 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:209(parse) 15 | 1 0.000 0.000 19.244 19.244 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:129(wrapper) 16 | 1 0.000 0.000 19.244 19.244 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:239(_parse_multipart) 17 | 1 0.000 0.000 19.244 19.244 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:578(parse) 18 | 2 0.000 0.000 19.244 9.622 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:404(__init__) 19 | 1 0.000 0.000 19.244 19.244 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:582() 20 | 2 2.413 1.206 19.244 9.622 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:531(parse_parts) 21 | 4184002 3.802 0.000 12.245 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:427(parse_lines) 22 | 2092005 0.584 0.000 8.443 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:687(make_line_iter) 23 | 2092005 5.643 0.000 7.859 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:733(_iter_basic_lines) 24 | 4183999 2.081 0.000 4.586 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:766(write) 25 | 4175903 1.965 0.000 1.965 0.000 {method 'write' of '_io.BufferedRandom' objects} 26 | 1 0.000 0.000 1.186 1.186 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:61(write_file_stream_to_dev_null) 27 | 1 1.185 1.185 1.185 1.185 {method 'writelines' of '_io._IOBase' objects} 28 | 4097 0.806 0.000 0.806 0.000 {method 'splitlines' of 'bytes' objects} 29 | 2100135 0.650 0.000 0.650 0.000 {method 'append' of 'list' objects} 30 | 4183999 0.534 0.000 0.539 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:655(_check) 31 | 2112380 0.297 0.000 0.297 0.000 {built-in method builtins.len} 32 | 4101 0.003 0.000 0.258 0.000 {built-in method builtins.next} 33 | 4098 0.004 0.000 0.254 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:666(_make_chunk_iter) 34 | 4098 0.023 0.000 0.250 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:928(read) 35 | 4098 0.041 0.000 0.217 0.000 {method 'read' of '_io.BufferedReader' objects} 36 | 2096058 0.210 0.000 0.210 0.000 {method 'join' of 'bytes' objects} 37 | 8192 0.013 0.000 0.175 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:572(readinto) 38 | 8192 0.125 0.000 0.125 0.000 {method 'recv_into' of '_socket.socket' objects} 39 | 8192 0.006 0.000 0.020 0.000 {method '_checkReadable' of '_io._IOBase' objects} 40 | 8192 0.016 0.000 0.016 0.000 {method '_checkClosed' of '_io._IOBase' objects} 41 | 8192 0.014 0.000 0.014 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:611(readable) 42 | 4097 0.006 0.000 0.006 0.000 {built-in method builtins.min} 43 | 8098 0.003 0.000 0.003 0.000 {method 'tell' of '_io.BytesIO' objects} 44 | 8097 0.002 0.000 0.002 0.000 {method 'write' of '_io.BytesIO' objects} 45 | 4 0.002 0.000 0.002 0.000 {built-in method io.open} 46 | 1 0.000 0.000 0.002 0.002 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:661(rollover) 47 | 1 0.000 0.000 0.001 0.001 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:573(TemporaryFile) 48 | 1 0.000 0.000 0.001 0.001 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:118(_sanitize_params) 49 | 1 0.000 0.000 0.001 0.001 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:291(gettempdir) 50 | 1 0.000 0.000 0.001 0.001 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:190(_get_default_tempdir) 51 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:363(_find_terminator) 52 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:157(__next__) 53 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:146(rng) 54 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:251(_mkstemp_inner) 55 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:306(jsonify) 56 | 2 0.000 0.000 0.000 0.000 {built-in method posix.open} 57 | 2 0.000 0.000 0.000 0.000 {built-in method posix.unlink} 58 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/random.py:87(__init__) 59 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/random.py:96(seed) 60 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:188(dumps) 61 | 2 0.000 0.000 0.000 0.000 {function Random.seed at 0x10a115510} 62 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:301(_get_current_object) 63 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/http.py:378(parse_options_header) 64 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:163(_candidate_tempdir_list) 65 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py:183(dumps) 66 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:369(abspath) 67 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:395(start_file_streaming) 68 | 1 0.000 0.000 0.000 0.000 {built-in method posix.close} 69 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:182(encode) 70 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:160() 71 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:163(top) 72 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:111(_dump_arg_defaults) 73 | 13 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:49(_find_app) 74 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:173(__init__) 75 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/os.py:760(getenv) 76 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:291(parse_multipart_headers) 77 | 16 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/random.py:255(choice) 78 | 1 0.000 0.000 0.000 0.000 {built-in method posix.getcwd} 79 | 4 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:327(__bool__) 80 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/_collections_abc.py:657(get) 81 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:282(make_form_data_parser) 82 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/common_descriptors.py:99(mimetype) 83 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:331(normpath) 84 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:988(get) 85 | 7 0.000 0.000 0.000 0.000 {method 'match' of '_sre.SRE_Pattern' objects} 86 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/common_descriptors.py:93(_parse_content_type) 87 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/os.py:664(__getitem__) 88 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:412(_iterencode) 89 | 16 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/random.py:223(_randbelow) 90 | 4 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:961(__getitem__) 91 | 2 0.000 0.000 0.000 0.000 {method 'seek' of '_io.BufferedRandom' objects} 92 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:244(_get_file_stream) 93 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:748(seek) 94 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:75(join) 95 | 26 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects} 96 | 20 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr} 97 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:333(_iterencode_dict) 98 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:53(default_stream_factory) 99 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:65(max_content_length) 100 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:35(_lookup_req_object) 101 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:70(__getattr__) 102 | 62 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 103 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:332(_get_stream_for_parsing) 104 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1247(__setitem__) 105 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:343(set_data) 106 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:64(isabs) 107 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:204(iterencode) 108 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1199(set) 109 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/_bootlocale.py:23(getpreferredencoding) 110 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/os.py:742(encode) 111 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:361(stream) 112 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:379(get_part_encoding) 113 | 4 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects} 114 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:638(__init__) 115 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:2831(__iter__) 116 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:182(get_content_length) 117 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:202(get_input_stream) 118 | 8 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/http.py:235(unquote_header_value) 119 | 5 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects} 120 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1367(__getitem__) 121 | 10 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects} 122 | 10 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects} 123 | 18 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident} 124 | 4 0.000 0.000 0.000 0.000 {method 'groups' of '_sre.SRE_Match' objects} 125 | 1 0.000 0.000 0.000 0.000 {built-in method itertools.tee} 126 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/_compat.py:204(to_native) 127 | 9 0.000 0.000 0.000 0.000 {built-in method posix.fspath} 128 | 29 0.000 0.000 0.000 0.000 {method 'getrandbits' of '_random.Random' objects} 129 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/exceptions.py:109(__init__) 130 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:953(__init__) 131 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:173(__init__) 132 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:292(_set_status_code) 133 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.sorted} 134 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:41(_get_sep) 135 | 2 0.000 0.000 0.000 0.000 {built-in method builtins.iter} 136 | 6 0.000 0.000 0.000 0.000 {method 'group' of '_sre.SRE_Match' objects} 137 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:237(_get_candidate_names) 138 | 6 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:911(_unicodify_header_value) 139 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:2708(__init__) 140 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:328(__init__) 141 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:894(on_exhausted) 142 | 5 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects} 143 | 11 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} 144 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/os.py:746(decode) 145 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:104(__init__) 146 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:259(_make_iterencode) 147 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:266(get_content_type) 148 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:880(__init__) 149 | 16 0.000 0.000 0.000 0.000 {method 'bit_length' of 'int' objects} 150 | 18 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} 151 | 3 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} 152 | 1 0.000 0.000 0.000 0.000 {built-in method _locale.nl_langinfo} 153 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:687(__iter__) 154 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/exceptions.py:80(__init__) 155 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:273(want_form_data_parsed) 156 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:527(headers) 157 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:280(_line_parse) 158 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:354(_fix_ie_filename) 159 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/app.py:867(debug) 160 | 3 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects} 161 | 2 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects} 162 | 2 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects} 163 | 4 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects} 164 | 2 0.000 0.000 0.000 0.000 {built-in method builtins.max} 165 | 2 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.lock' objects} 166 | 2 0.000 0.000 0.000 0.000 {built-in method posix.getpid} 167 | 1 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects} 168 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/codecs.py:185(__init__) 169 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:97(_infer_return_type) 170 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:431(__getitem__) 171 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1178(_validate_value) 172 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:195(get_parse_func) 173 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:81(blueprint) 174 | 1 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} 175 | 1 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects} 176 | 3 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects} 177 | 1 0.000 0.000 0.000 0.000 {method 'write' of '_io.BufferedWriter' objects} 178 | 1 0.000 0.000 0.000 0.000 {built-in method _tracemalloc.start} 179 | 2 0.000 0.000 0.000 0.000 {built-in method _json.encode_basestring_ascii} 180 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/_compat.py:166(make_literal_wrapper) 181 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1359(__init__) 182 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:583() 183 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:913(exhaust) 184 | 1 0.000 0.000 0.000 0.000 {method 'strip' of 'bytes' objects} 185 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.id} 186 | 2 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects} 187 | 4 0.000 0.000 0.000 0.000 {method 'end' of '_sre.SRE_Match' objects} 188 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:353() 189 | 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 190 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:690(_assert_not_shallow) 191 | 192 | 193 | ######## Memory profiling. ######## 194 | [ Top 10 ] 195 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:65: size=45.5 KiB, count=396, average=118 B 196 | /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/urls.py:399: size=36.5 KiB, count=3, average=12.2 KiB 197 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:55: size=25.1 KiB, count=1013, average=25 B 198 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:67: size=24.7 KiB, count=183, average=138 B 199 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:87: size=23.9 KiB, count=285, average=86 B 200 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:218: size=21.1 KiB, count=180, average=120 B 201 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tracemalloc.py:65: size=13.0 KiB, count=185, average=72 B 202 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:119: size=10080 B, count=217, average=46 B 203 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:250: size=8488 B, count=3, average=2829 B 204 | /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:45: size=4830 B, count=8, average=604 B 205 | -------------------------------------------------------------------------------- /benchmark/multipart-form-data_536871062-bytes.txt: -------------------------------------------------------------------------------- 1 | ######## Time and calls profiling. ######## 2 | 54617651 function calls (54617642 primitive calls) in 41.110 seconds 3 | 4 | Ordered by: cumulative time 5 | 6 | ncalls tottime percall cumtime percall filename:lineno(function) 7 | 1 0.000 0.000 41.110 41.110 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:78(upload_request_files) 8 | 14/12 0.000 0.000 38.646 3.220 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:345(__getattr__) 9 | 22/17 0.000 0.000 38.646 2.273 {built-in method builtins.getattr} 10 | 5/3 0.000 0.000 38.646 12.882 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:85(__get__) 11 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:493(files) 12 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:87(_load_form_data) 13 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:297(_load_form_data) 14 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:209(parse) 15 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:129(wrapper) 16 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:239(_parse_multipart) 17 | 1 0.000 0.000 38.645 38.645 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:578(parse) 18 | 2 0.000 0.000 38.645 19.323 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:404(__init__) 19 | 1 0.000 0.000 38.645 38.645 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:582() 20 | 2 4.834 2.417 38.645 19.323 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:531(parse_parts) 21 | 8371212 7.648 0.000 24.488 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:427(parse_lines) 22 | 4185610 1.166 0.000 16.839 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:687(make_line_iter) 23 | 4185610 11.287 0.000 15.672 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:733(_iter_basic_lines) 24 | 8371209 4.095 0.000 9.324 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:766(write) 25 | 8363275 4.126 0.000 4.126 0.000 {method 'write' of '_io.BufferedRandom' objects} 26 | 1 0.000 0.000 2.464 2.464 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:61(write_file_stream_to_dev_null) 27 | 1 2.464 2.464 2.464 2.464 {method 'writelines' of '_io._IOBase' objects} 28 | 8193 1.622 0.000 1.622 0.000 {method 'splitlines' of 'bytes' objects} 29 | 4201877 1.246 0.000 1.246 0.000 {method 'append' of 'list' objects} 30 | 8371209 1.095 0.000 1.102 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:655(_check) 31 | 4226385 0.591 0.000 0.591 0.000 {built-in method builtins.len} 32 | 8196 0.007 0.000 0.516 0.000 {built-in method builtins.next} 33 | 8194 0.009 0.000 0.509 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:666(_make_chunk_iter) 34 | 8194 0.044 0.000 0.500 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:928(read) 35 | 8194 0.082 0.000 0.435 0.000 {method 'read' of '_io.BufferedReader' objects} 36 | 4193735 0.419 0.000 0.419 0.000 {method 'join' of 'bytes' objects} 37 | 16384 0.026 0.000 0.354 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:572(readinto) 38 | 16384 0.255 0.000 0.255 0.000 {method 'recv_into' of '_socket.socket' objects} 39 | 16384 0.012 0.000 0.039 0.000 {method '_checkReadable' of '_io._IOBase' objects} 40 | 16384 0.033 0.000 0.033 0.000 {method '_checkClosed' of '_io._IOBase' objects} 41 | 16384 0.028 0.000 0.028 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:611(readable) 42 | 8193 0.013 0.000 0.013 0.000 {built-in method builtins.min} 43 | 1 0.000 0.000 0.004 0.004 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:661(rollover) 44 | 1 0.000 0.000 0.004 0.004 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:573(TemporaryFile) 45 | 1 0.000 0.000 0.004 0.004 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:251(_mkstemp_inner) 46 | 1 0.003 0.003 0.003 0.003 {built-in method posix.open} 47 | 7936 0.003 0.000 0.003 0.000 {method 'tell' of '_io.BytesIO' objects} 48 | 7935 0.002 0.000 0.002 0.000 {method 'write' of '_io.BytesIO' objects} 49 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:363(_find_terminator) 50 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:306(jsonify) 51 | 3 0.000 0.000 0.000 0.000 {built-in method io.open} 52 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:188(dumps) 53 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:301(_get_current_object) 54 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/http.py:378(parse_options_header) 55 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:163(top) 56 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py:183(dumps) 57 | 13 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:49(_find_app) 58 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:182(encode) 59 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:111(_dump_arg_defaults) 60 | 67 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects} 61 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:157(__next__) 62 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:173(__init__) 63 | 1 0.000 0.000 0.000 0.000 {built-in method posix.unlink} 64 | 4 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:327(__bool__) 65 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:291(parse_multipart_headers) 66 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:369(abspath) 67 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:412(_iterencode) 68 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:395(start_file_streaming) 69 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:70(__getattr__) 70 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:160() 71 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:282(make_form_data_parser) 72 | 7 0.000 0.000 0.000 0.000 {method 'match' of '_sre.SRE_Pattern' objects} 73 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:988(get) 74 | 20 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr} 75 | 8 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/random.py:255(choice) 76 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:333(_iterencode_dict) 77 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/common_descriptors.py:99(mimetype) 78 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:75(join) 79 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/common_descriptors.py:93(_parse_content_type) 80 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:35(_lookup_req_object) 81 | 4 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:961(__getitem__) 82 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:65(max_content_length) 83 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1247(__setitem__) 84 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:331(normpath) 85 | 8 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/random.py:223(_randbelow) 86 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:332(_get_stream_for_parsing) 87 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:343(set_data) 88 | 54 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 89 | 2 0.000 0.000 0.000 0.000 {method 'seek' of '_io.BufferedRandom' objects} 90 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:204(iterencode) 91 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1199(set) 92 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:748(seek) 93 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:361(stream) 94 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:202(get_input_stream) 95 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:146(rng) 96 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1367(__getitem__) 97 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:182(get_content_length) 98 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:64(isabs) 99 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:244(_get_file_stream) 100 | 18 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident} 101 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/_bootlocale.py:23(getpreferredencoding) 102 | 8 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/http.py:235(unquote_header_value) 103 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:379(get_part_encoding) 104 | 3 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects} 105 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:118(_sanitize_params) 106 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/exceptions.py:109(__init__) 107 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/_compat.py:204(to_native) 108 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:2831(__iter__) 109 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:53(default_stream_factory) 110 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:292(_set_status_code) 111 | 10 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects} 112 | 6 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:911(_unicodify_header_value) 113 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:953(__init__) 114 | 11 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} 115 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.sorted} 116 | 6 0.000 0.000 0.000 0.000 {method 'group' of '_sre.SRE_Match' objects} 117 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:41(_get_sep) 118 | 2 0.000 0.000 0.000 0.000 {built-in method builtins.iter} 119 | 1 0.000 0.000 0.000 0.000 {built-in method itertools.tee} 120 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:638(__init__) 121 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:266(get_content_type) 122 | 3 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects} 123 | 6 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects} 124 | 5 0.000 0.000 0.000 0.000 {built-in method posix.fspath} 125 | 4 0.000 0.000 0.000 0.000 {method 'groups' of '_sre.SRE_Match' objects} 126 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:104(__init__) 127 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:259(_make_iterencode) 128 | 12 0.000 0.000 0.000 0.000 {method 'getrandbits' of '_random.Random' objects} 129 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:527(headers) 130 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:880(__init__) 131 | 18 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} 132 | 2 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects} 133 | 1 0.000 0.000 0.000 0.000 {built-in method _locale.nl_langinfo} 134 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:687(__iter__) 135 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/exceptions.py:80(__init__) 136 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:280(_line_parse) 137 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:328(__init__) 138 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:894(on_exhausted) 139 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/app.py:867(debug) 140 | 2 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects} 141 | 2 0.000 0.000 0.000 0.000 {built-in method builtins.max} 142 | 1 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects} 143 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/codecs.py:185(__init__) 144 | 2 0.000 0.000 0.000 0.000 {built-in method _json.encode_basestring_ascii} 145 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:97(_infer_return_type) 146 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:431(__getitem__) 147 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1178(_validate_value) 148 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:273(want_form_data_parsed) 149 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:2708(__init__) 150 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:173(__init__) 151 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:195(get_parse_func) 152 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:354(_fix_ie_filename) 153 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:583() 154 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:81(blueprint) 155 | 1 0.000 0.000 0.000 0.000 {method 'strip' of 'bytes' objects} 156 | 1 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects} 157 | 8 0.000 0.000 0.000 0.000 {method 'bit_length' of 'int' objects} 158 | 3 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} 159 | 1 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} 160 | 1 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects} 161 | 3 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects} 162 | 3 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects} 163 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.id} 164 | 1 0.000 0.000 0.000 0.000 {built-in method posix.getpid} 165 | 4 0.000 0.000 0.000 0.000 {method 'end' of '_sre.SRE_Match' objects} 166 | 1 0.000 0.000 0.000 0.000 {built-in method _tracemalloc.start} 167 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:237(_get_candidate_names) 168 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/_compat.py:166(make_literal_wrapper) 169 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1359(__init__) 170 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:690(_assert_not_shallow) 171 | 2 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects} 172 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:353() 173 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:291(gettempdir) 174 | 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 175 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:913(exhaust) 176 | 177 | 178 | ######## Memory profiling. ######## 179 | [ Top 10 ] 180 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:65: size=43.7 KiB, count=383, average=117 B 181 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tracemalloc.py:65: size=40.9 KiB, count=582, average=72 B 182 | /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/urls.py:399: size=36.5 KiB, count=3, average=12.2 KiB 183 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:55: size=24.6 KiB, count=954, average=26 B 184 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:87: size=23.4 KiB, count=285, average=84 B 185 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:218: size=21.1 KiB, count=180, average=120 B 186 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:67: size=20.2 KiB, count=183, average=113 B 187 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:436: size=10.9 KiB, count=52, average=214 B 188 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:250: size=8784 B, count=5, average=1757 B 189 | /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:45: size=4830 B, count=8, average=604 B 190 | -------------------------------------------------------------------------------- /benchmark/multipart-form-data_536871062bytes.txt: -------------------------------------------------------------------------------- 1 | ######## Time and calls profiling. ######## 2 | 54617651 function calls (54617642 primitive calls) in 41.110 seconds 3 | 4 | Ordered by: cumulative time 5 | 6 | ncalls tottime percall cumtime percall filename:lineno(function) 7 | 1 0.000 0.000 41.110 41.110 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:78(upload_request_files) 8 | 14/12 0.000 0.000 38.646 3.220 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:345(__getattr__) 9 | 22/17 0.000 0.000 38.646 2.273 {built-in method builtins.getattr} 10 | 5/3 0.000 0.000 38.646 12.882 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:85(__get__) 11 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:493(files) 12 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:87(_load_form_data) 13 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:297(_load_form_data) 14 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:209(parse) 15 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:129(wrapper) 16 | 1 0.000 0.000 38.646 38.646 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:239(_parse_multipart) 17 | 1 0.000 0.000 38.645 38.645 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:578(parse) 18 | 2 0.000 0.000 38.645 19.323 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:404(__init__) 19 | 1 0.000 0.000 38.645 38.645 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:582() 20 | 2 4.834 2.417 38.645 19.323 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:531(parse_parts) 21 | 8371212 7.648 0.000 24.488 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:427(parse_lines) 22 | 4185610 1.166 0.000 16.839 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:687(make_line_iter) 23 | 4185610 11.287 0.000 15.672 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:733(_iter_basic_lines) 24 | 8371209 4.095 0.000 9.324 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:766(write) 25 | 8363275 4.126 0.000 4.126 0.000 {method 'write' of '_io.BufferedRandom' objects} 26 | 1 0.000 0.000 2.464 2.464 /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:61(write_file_stream_to_dev_null) 27 | 1 2.464 2.464 2.464 2.464 {method 'writelines' of '_io._IOBase' objects} 28 | 8193 1.622 0.000 1.622 0.000 {method 'splitlines' of 'bytes' objects} 29 | 4201877 1.246 0.000 1.246 0.000 {method 'append' of 'list' objects} 30 | 8371209 1.095 0.000 1.102 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:655(_check) 31 | 4226385 0.591 0.000 0.591 0.000 {built-in method builtins.len} 32 | 8196 0.007 0.000 0.516 0.000 {built-in method builtins.next} 33 | 8194 0.009 0.000 0.509 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:666(_make_chunk_iter) 34 | 8194 0.044 0.000 0.500 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:928(read) 35 | 8194 0.082 0.000 0.435 0.000 {method 'read' of '_io.BufferedReader' objects} 36 | 4193735 0.419 0.000 0.419 0.000 {method 'join' of 'bytes' objects} 37 | 16384 0.026 0.000 0.354 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:572(readinto) 38 | 16384 0.255 0.000 0.255 0.000 {method 'recv_into' of '_socket.socket' objects} 39 | 16384 0.012 0.000 0.039 0.000 {method '_checkReadable' of '_io._IOBase' objects} 40 | 16384 0.033 0.000 0.033 0.000 {method '_checkClosed' of '_io._IOBase' objects} 41 | 16384 0.028 0.000 0.028 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:611(readable) 42 | 8193 0.013 0.000 0.013 0.000 {built-in method builtins.min} 43 | 1 0.000 0.000 0.004 0.004 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:661(rollover) 44 | 1 0.000 0.000 0.004 0.004 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:573(TemporaryFile) 45 | 1 0.000 0.000 0.004 0.004 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:251(_mkstemp_inner) 46 | 1 0.003 0.003 0.003 0.003 {built-in method posix.open} 47 | 7936 0.003 0.000 0.003 0.000 {method 'tell' of '_io.BytesIO' objects} 48 | 7935 0.002 0.000 0.002 0.000 {method 'write' of '_io.BytesIO' objects} 49 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:363(_find_terminator) 50 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:306(jsonify) 51 | 3 0.000 0.000 0.000 0.000 {built-in method io.open} 52 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:188(dumps) 53 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:301(_get_current_object) 54 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/http.py:378(parse_options_header) 55 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:163(top) 56 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py:183(dumps) 57 | 13 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:49(_find_app) 58 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:182(encode) 59 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/json/__init__.py:111(_dump_arg_defaults) 60 | 67 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects} 61 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:157(__next__) 62 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:173(__init__) 63 | 1 0.000 0.000 0.000 0.000 {built-in method posix.unlink} 64 | 4 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:327(__bool__) 65 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:291(parse_multipart_headers) 66 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:369(abspath) 67 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:412(_iterencode) 68 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:395(start_file_streaming) 69 | 18 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/local.py:70(__getattr__) 70 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:160() 71 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:282(make_form_data_parser) 72 | 7 0.000 0.000 0.000 0.000 {method 'match' of '_sre.SRE_Pattern' objects} 73 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:988(get) 74 | 20 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr} 75 | 8 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/random.py:255(choice) 76 | 8 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:333(_iterencode_dict) 77 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/common_descriptors.py:99(mimetype) 78 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:75(join) 79 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/common_descriptors.py:93(_parse_content_type) 80 | 5 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/globals.py:35(_lookup_req_object) 81 | 4 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:961(__getitem__) 82 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:65(max_content_length) 83 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1247(__setitem__) 84 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:331(normpath) 85 | 8 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/random.py:223(_randbelow) 86 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:332(_get_stream_for_parsing) 87 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:343(set_data) 88 | 54 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 89 | 2 0.000 0.000 0.000 0.000 {method 'seek' of '_io.BufferedRandom' objects} 90 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:204(iterencode) 91 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1199(set) 92 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:748(seek) 93 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:361(stream) 94 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:202(get_input_stream) 95 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:146(rng) 96 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1367(__getitem__) 97 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:182(get_content_length) 98 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:64(isabs) 99 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:244(_get_file_stream) 100 | 18 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident} 101 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/_bootlocale.py:23(getpreferredencoding) 102 | 8 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/http.py:235(unquote_header_value) 103 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:379(get_part_encoding) 104 | 3 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects} 105 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:118(_sanitize_params) 106 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/exceptions.py:109(__init__) 107 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/_compat.py:204(to_native) 108 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:2831(__iter__) 109 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:53(default_stream_factory) 110 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:292(_set_status_code) 111 | 10 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects} 112 | 6 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:911(_unicodify_header_value) 113 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:953(__init__) 114 | 11 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} 115 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.sorted} 116 | 6 0.000 0.000 0.000 0.000 {method 'group' of '_sre.SRE_Match' objects} 117 | 3 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/posixpath.py:41(_get_sep) 118 | 2 0.000 0.000 0.000 0.000 {built-in method builtins.iter} 119 | 1 0.000 0.000 0.000 0.000 {built-in method itertools.tee} 120 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:638(__init__) 121 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/utils.py:266(get_content_type) 122 | 3 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects} 123 | 6 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects} 124 | 5 0.000 0.000 0.000 0.000 {built-in method posix.fspath} 125 | 4 0.000 0.000 0.000 0.000 {method 'groups' of '_sre.SRE_Match' objects} 126 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:104(__init__) 127 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:259(_make_iterencode) 128 | 12 0.000 0.000 0.000 0.000 {method 'getrandbits' of '_random.Random' objects} 129 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:527(headers) 130 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:880(__init__) 131 | 18 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} 132 | 2 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects} 133 | 1 0.000 0.000 0.000 0.000 {built-in method _locale.nl_langinfo} 134 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:687(__iter__) 135 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/exceptions.py:80(__init__) 136 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:280(_line_parse) 137 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:328(__init__) 138 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:894(on_exhausted) 139 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/app.py:867(debug) 140 | 2 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects} 141 | 2 0.000 0.000 0.000 0.000 {built-in method builtins.max} 142 | 1 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects} 143 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/bin/../lib/python3.6/codecs.py:185(__init__) 144 | 2 0.000 0.000 0.000 0.000 {built-in method _json.encode_basestring_ascii} 145 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:97(_infer_return_type) 146 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:431(__getitem__) 147 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1178(_validate_value) 148 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:273(want_form_data_parsed) 149 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:2708(__init__) 150 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:173(__init__) 151 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:195(get_parse_func) 152 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:354(_fix_ie_filename) 153 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/formparser.py:583() 154 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/flask/wrappers.py:81(blueprint) 155 | 1 0.000 0.000 0.000 0.000 {method 'strip' of 'bytes' objects} 156 | 1 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects} 157 | 8 0.000 0.000 0.000 0.000 {method 'bit_length' of 'int' objects} 158 | 3 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} 159 | 1 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} 160 | 1 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects} 161 | 3 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects} 162 | 3 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects} 163 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.id} 164 | 1 0.000 0.000 0.000 0.000 {built-in method posix.getpid} 165 | 4 0.000 0.000 0.000 0.000 {method 'end' of '_sre.SRE_Match' objects} 166 | 1 0.000 0.000 0.000 0.000 {built-in method _tracemalloc.start} 167 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:237(_get_candidate_names) 168 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/_compat.py:166(make_literal_wrapper) 169 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/datastructures.py:1359(__init__) 170 | 2 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:690(_assert_not_shallow) 171 | 2 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects} 172 | 1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py:353() 173 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/tempfile.py:291(gettempdir) 174 | 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 175 | 1 0.000 0.000 0.000 0.000 /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/wsgi.py:913(exhaust) 176 | 177 | 178 | ######## Memory profiling. ######## 179 | [ Top 10 ] 180 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:65: size=43.7 KiB, count=383, average=117 B 181 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tracemalloc.py:65: size=40.9 KiB, count=582, average=72 B 182 | /Users/rodrigdi/.virtualenvs/big-file-upload-server/lib/python3.6/site-packages/werkzeug/urls.py:399: size=36.5 KiB, count=3, average=12.2 KiB 183 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:55: size=24.6 KiB, count=954, average=26 B 184 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:87: size=23.4 KiB, count=285, average=84 B 185 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:218: size=21.1 KiB, count=180, average=120 B 186 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/cProfile.py:67: size=20.2 KiB, count=183, average=113 B 187 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pstats.py:436: size=10.9 KiB, count=52, average=214 B 188 | /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py:250: size=8784 B, count=5, average=1757 B 189 | /Users/rodrigdi/code/reanahub/playground/uwsgi-big-files/app.py:45: size=4830 B, count=8, average=604 B 190 | -------------------------------------------------------------------------------- /check-files-integrity.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | file_sizes='256MB 512MB 1024MB 2048MB' 3 | 4 | echo "Removing existing files and downloads ..." 5 | rm *-file.txt 6 | rm -rf downloads 7 | 8 | echo "Re-creating new files of sizes: $file_sizes" 9 | dd if=/dev/random of=256MB-file.txt count=256 bs=1048576 10 | echo "Original file 256MB-file.txt created." 11 | dd if=/dev/random of=512MB-file.txt count=512 bs=1048576 12 | echo "Original file 512MB-file.txt created." 13 | dd if=/dev/random of=1024MB-file.txt count=1024 bs=1048576 14 | echo "Original file 1024MB-file.txt created." 15 | dd if=/dev/random of=2048MB-file.txt count=2048 bs=1048576 16 | echo "Original file 2048MB-file.txt created." 17 | 18 | python - << END 19 | import requests 20 | for size in ['256MB', '512MB', '1024MB', '2048MB']: 21 | print(f'Uploading {size} file ...') 22 | with open(f'{size}-file.txt', 'rb') as f: 23 | requests.post('http://localhost:5000/stream-pass-to-next', headers={'Content-Type': 'application/octet-stream'}, data=f) 24 | END 25 | for size in $file_sizes 26 | do 27 | original_file="${size}-file.txt" 28 | original_file_md5=`md5sum ${size}-file.txt | cut -d' ' -f1` 29 | echo "md5($original_file) -> $original_file_md5" 30 | uploaded_file=`ls downloads/${size}_*` 31 | uploaded_file_md5=`md5sum $uploaded_file | cut -d' ' -f1` 32 | echo "md5($uploaded_file) -> $uploaded_file_md5" 33 | test "$uploaded_file_md5" = "$original_file_md5" 34 | echo "${size} - $?" 35 | done 36 | -------------------------------------------------------------------------------- /docker-benchmark/application-octet-stream_268435456-bytes.txt: -------------------------------------------------------------------------------- 1 | ######## Time and calls profiling. ######## 2 | 4192841 function calls in 77.104 seconds 3 | 4 | Ordered by: cumulative time 5 | 6 | ncalls tottime percall cumtime percall filename:lineno(function) 7 | 1 0.000 0.000 77.095 77.095 ./app.py:96(upload_request_stream) 8 | 1 0.000 0.000 77.094 77.094 ./app.py:61(write_file_stream_to_dev_null) 9 | 1 11.598 11.598 77.091 77.091 {method 'writelines' of '_io._IOBase' objects} 10 | 1048154 17.230 0.000 65.493 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:993(__next__) 11 | 1048154 28.840 0.000 48.264 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:947(readline) 12 | 1048153 11.208 0.000 11.208 0.000 {method 'readline' of 'uwsgi._Input' objects} 13 | 1048155 8.215 0.000 8.215 0.000 {built-in method builtins.len} 14 | 2 0.008 0.004 0.008 0.004 {built-in method io.open} 15 | 1 0.000 0.000 0.003 0.003 /usr/local/lib/python3.6/site-packages/flask/json/__init__.py:306(jsonify) 16 | 12 0.000 0.000 0.002 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/local.py:345(__getattr__) 17 | 14 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/local.py:301(_get_current_object) 18 | 1 0.000 0.000 0.001 0.001 /usr/local/lib/python3.6/site-packages/flask/json/__init__.py:188(dumps) 19 | 1 0.000 0.000 0.001 0.001 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:173(__init__) 20 | 1 0.000 0.000 0.001 0.001 /usr/local/lib/python3.6/site-packages/flask/json/__init__.py:111(_dump_arg_defaults) 21 | 17 0.000 0.000 0.001 0.000 {built-in method builtins.getattr} 22 | 14 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/local.py:163(top) 23 | 9 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/flask/globals.py:49(_find_app) 24 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:1247(__setitem__) 25 | 5 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/flask/globals.py:35(_lookup_req_object) 26 | 3 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/utils.py:85(__get__) 27 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:1199(set) 28 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:343(set_data) 29 | 14 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/local.py:70(__getattr__) 30 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:361(stream) 31 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:988(get) 32 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/local.py:327(__bool__) 33 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/json/__init__.py:183(dumps) 34 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:202(get_input_stream) 35 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:1367(__getitem__) 36 | 6 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:911(_unicodify_header_value) 37 | 14 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr} 38 | 25 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 39 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/json/encoder.py:182(encode) 40 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/posixpath.py:75(join) 41 | 14 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident} 42 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:182(get_content_length) 43 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/utils.py:266(get_content_type) 44 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/_bootlocale.py:23(getpreferredencoding) 45 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:292(_set_status_code) 46 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/json/encoder.py:204(iterencode) 47 | 7 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} 48 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:527(headers) 49 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:1178(_validate_value) 50 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:894(on_exhausted) 51 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/posixpath.py:41(_get_sep) 52 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:953(__init__) 53 | 1 0.000 0.000 0.000 0.000 {built-in method _locale.nl_langinfo} 54 | 3 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects} 55 | 2 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} 56 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:880(__init__) 57 | 3 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects} 58 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/codecs.py:185(__init__) 59 | 1 0.000 0.000 0.000 0.000 {built-in method _tracemalloc.start} 60 | 2 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects} 61 | 2 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} 62 | 2 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} 63 | 2 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects} 64 | 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 65 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/json/encoder.py:104(__init__) 66 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/flask/app.py:867(debug) 67 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:1359(__init__) 68 | 1 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects} 69 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/flask/wrappers.py:81(blueprint) 70 | 1 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects} 71 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.max} 72 | 1 0.000 0.000 0.000 0.000 {method 'read' of 'uwsgi._Input' objects} 73 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:690(_assert_not_shallow) 74 | 1 0.000 0.000 0.000 0.000 {built-in method builtins.iter} 75 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:886(__iter__) 76 | 1 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} 77 | 1 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects} 78 | 1 0.000 0.000 0.000 0.000 {built-in method posix.fspath} 79 | 80 | 81 | ######## Memory profiling. ######## 82 | [ Top 10 ] 83 | /usr/local/lib/python3.6/cProfile.py:65: size=16.5 KiB, count=142, average=119 B 84 | /usr/local/lib/python3.6/pstats.py:431: size=10.6 KiB, count=73, average=149 B 85 | /usr/local/lib/python3.6/cProfile.py:55: size=10.1 KiB, count=366, average=28 B 86 | /usr/local/lib/python3.6/cProfile.py:67: size=8368 B, count=71, average=118 B 87 | /usr/local/lib/python3.6/pstats.py:218: size=8160 B, count=68, average=120 B 88 | /usr/local/lib/python3.6/cProfile.py:87: size=6776 B, count=82, average=83 B 89 | /usr/local/lib/python3.6/pstats.py:436: size=6537 B, count=72, average=91 B 90 | /usr/local/lib/python3.6/cProfile.py:119: size=5784 B, count=106, average=55 B 91 | ./app.py:45: size=4742 B, count=8, average=593 B 92 | /usr/local/lib/python3.6/pstats.py:426: size=3384 B, count=73, average=46 B 93 | -------------------------------------------------------------------------------- /docker-benchmark/multipart-form-data_268435606-bytes.txt: -------------------------------------------------------------------------------- 1 | ######## Time and calls profiling. ######## 2 | 27261843 function calls (27261833 primitive calls) in 457.781 seconds 3 | 4 | Ordered by: cumulative time 5 | 6 | ncalls tottime percall cumtime percall filename:lineno(function) 7 | 1 0.000 0.000 457.776 457.776 ./app.py:78(upload_request_files) 8 | 14/12 0.000 0.000 456.673 38.056 /usr/local/lib/python3.6/site-packages/werkzeug/local.py:345(__getattr__) 9 | 23/17 0.000 0.000 456.672 26.863 {built-in method builtins.getattr} 10 | 5/3 0.000 0.000 456.671 152.224 /usr/local/lib/python3.6/site-packages/werkzeug/utils.py:85(__get__) 11 | 1 0.000 0.000 456.671 456.671 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:493(files) 12 | 1 0.000 0.000 456.671 456.671 /usr/local/lib/python3.6/site-packages/flask/wrappers.py:87(_load_form_data) 13 | 1 0.000 0.000 456.671 456.671 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:297(_load_form_data) 14 | 1 0.000 0.000 456.670 456.670 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:209(parse) 15 | 1 0.000 0.000 456.670 456.670 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:129(wrapper) 16 | 1 0.000 0.000 456.669 456.669 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:239(_parse_multipart) 17 | 1 0.000 0.000 456.669 456.669 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:578(parse) 18 | 2 0.000 0.000 456.669 228.335 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:404(__init__) 19 | 1 0.000 0.000 456.669 456.669 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:582() 20 | 2 69.465 34.733 456.669 228.335 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:531(parse_parts) 21 | 4184002 60.927 0.000 220.638 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:427(parse_lines) 22 | 4183999 98.013 0.000 166.565 0.000 /usr/local/lib/python3.6/tempfile.py:766(write) 23 | 2092005 31.437 0.000 159.709 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:687(make_line_iter) 24 | 2092005 76.407 0.000 128.272 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:733(_iter_basic_lines) 25 | 4175903 36.773 0.000 36.773 0.000 {method 'write' of '_io.BufferedRandom' objects} 26 | 4183999 31.625 0.000 31.708 0.000 /usr/local/lib/python3.6/tempfile.py:655(_check) 27 | 2100124 18.263 0.000 18.263 0.000 {method 'append' of 'list' objects} 28 | 2112380 15.981 0.000 15.981 0.000 {built-in method builtins.len} 29 | 2096058 15.709 0.000 15.709 0.000 {method 'join' of 'bytes' objects} 30 | 4101 0.067 0.000 1.135 0.000 {built-in method builtins.next} 31 | 1 0.000 0.000 1.104 1.104 ./app.py:61(write_file_stream_to_dev_null) 32 | 1 1.102 1.102 1.102 1.102 {method 'writelines' of '_io._IOBase' objects} 33 | 4098 0.069 0.000 1.066 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:666(_make_chunk_iter) 34 | 4098 0.204 0.000 0.997 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:928(read) 35 | 4097 0.852 0.000 0.852 0.000 {method 'splitlines' of 'bytes' objects} 36 | 4098 0.675 0.000 0.675 0.000 {method 'read' of 'uwsgi._Input' objects} 37 | 8098 0.078 0.000 0.078 0.000 {method 'tell' of '_io.BytesIO' objects} 38 | 8097 0.071 0.000 0.071 0.000 {method 'write' of '_io.BytesIO' objects} 39 | 4097 0.045 0.000 0.045 0.000 {built-in method builtins.min} 40 | 1 0.000 0.000 0.005 0.005 /usr/local/lib/python3.6/tempfile.py:661(rollover) 41 | 1 0.000 0.000 0.005 0.005 /usr/local/lib/python3.6/tempfile.py:573(TemporaryFile) 42 | 4 0.004 0.001 0.005 0.001 {built-in method io.open} 43 | 1 0.000 0.000 0.003 0.003 /usr/local/lib/python3.6/tempfile.py:118(_sanitize_params) 44 | 1 0.000 0.000 0.003 0.003 /usr/local/lib/python3.6/tempfile.py:291(gettempdir) 45 | 1 0.000 0.000 0.003 0.003 /usr/local/lib/python3.6/tempfile.py:190(_get_default_tempdir) 46 | 1 0.000 0.000 0.002 0.002 /usr/local/lib/python3.6/site-packages/flask/json/__init__.py:306(jsonify) 47 | 2 0.000 0.000 0.002 0.001 /usr/local/lib/python3.6/tempfile.py:157(__next__) 48 | 18 0.000 0.000 0.002 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/local.py:301(_get_current_object) 49 | 1 0.000 0.000 0.002 0.002 /usr/local/lib/python3.6/tempfile.py:251(_mkstemp_inner) 50 | 2 0.000 0.000 0.002 0.001 /usr/local/lib/python3.6/tempfile.py:160() 51 | 16 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/random.py:255(choice) 52 | 1 0.000 0.000 0.001 0.001 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:363(_find_terminator) 53 | 1 0.000 0.000 0.001 0.001 /usr/local/lib/python3.6/site-packages/flask/json/__init__.py:188(dumps) 54 | 1 0.000 0.000 0.001 0.001 /usr/local/lib/python3.6/site-packages/flask/json/__init__.py:111(_dump_arg_defaults) 55 | 13 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/site-packages/flask/globals.py:49(_find_app) 56 | 18 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/local.py:163(top) 57 | 16 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/random.py:223(_randbelow) 58 | 2 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/http.py:378(parse_options_header) 59 | 1 0.000 0.000 0.001 0.001 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:395(start_file_streaming) 60 | 2 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/posixpath.py:376(abspath) 61 | 1 0.000 0.000 0.001 0.001 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:173(__init__) 62 | 4 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/local.py:327(__bool__) 63 | 1 0.000 0.000 0.001 0.001 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:291(parse_multipart_headers) 64 | 1 0.000 0.000 0.001 0.001 /usr/local/lib/python3.6/tempfile.py:163(_candidate_tempdir_list) 65 | 18 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/local.py:70(__getattr__) 66 | 4 0.000 0.000 0.001 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:961(__getitem__) 67 | 5 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:988(get) 68 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/tempfile.py:146(rng) 69 | 54 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 70 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:282(make_form_data_parser) 71 | 3 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/os.py:760(getenv) 72 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:1247(__setitem__) 73 | 5 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/flask/globals.py:35(_lookup_req_object) 74 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/posixpath.py:338(normpath) 75 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/flask/wrappers.py:65(max_content_length) 76 | 3 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/posixpath.py:75(join) 77 | 3 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/_collections_abc.py:657(get) 78 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:1199(set) 79 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:343(set_data) 80 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:332(_get_stream_for_parsing) 81 | 26 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects} 82 | 3 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/os.py:664(__getitem__) 83 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/random.py:87(__init__) 84 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:244(_get_file_stream) 85 | 19 0.000 0.000 0.000 0.000 {built-in method builtins.hasattr} 86 | 18 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident} 87 | 6 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:911(_unicodify_header_value) 88 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:53(default_stream_factory) 89 | 3 0.000 0.000 0.000 0.000 {built-in method posix.open} 90 | 6 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/http.py:235(unquote_header_value) 91 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:361(stream) 92 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:1367(__getitem__) 93 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/random.py:96(seed) 94 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/posixpath.py:64(isabs) 95 | 19 0.000 0.000 0.000 0.000 {method 'getrandbits' of '_random.Random' objects} 96 | 3 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/os.py:742(encode) 97 | 17 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} 98 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:202(get_input_stream) 99 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:182(get_content_length) 100 | 16 0.000 0.000 0.000 0.000 {method 'bit_length' of 'int' objects} 101 | 5 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/posixpath.py:41(_get_sep) 102 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/json/__init__.py:183(dumps) 103 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/tempfile.py:638(__init__) 104 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/exceptions.py:109(__init__) 105 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:379(get_part_encoding) 106 | 2 0.000 0.000 0.000 0.000 {built-in method posix.unlink} 107 | 5 0.000 0.000 0.000 0.000 {method 'match' of '_sre.SRE_Pattern' objects} 108 | 10 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects} 109 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/_compat.py:204(to_native) 110 | 10 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects} 111 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/json/encoder.py:182(encode) 112 | 9 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects} 113 | 9 0.000 0.000 0.000 0.000 {built-in method posix.fspath} 114 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:2831(__iter__) 115 | 2 0.000 0.000 0.000 0.000 {function Random.seed at 0x7ff6323727b8} 116 | 5 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects} 117 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:953(__init__) 118 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/tempfile.py:237(_get_candidate_names) 119 | 4 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects} 120 | 5 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects} 121 | 2 0.000 0.000 0.000 0.000 {built-in method builtins.iter} 122 | 1 0.000 0.000 0.000 0.000 {built-in method itertools.tee} 123 | 2 0.000 0.000 0.000 0.000 {method 'seek' of '_io.BufferedRandom' objects} 124 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/tempfile.py:748(seek) 125 | 3 0.000 0.000 0.000 0.000 {method 'groups' of '_sre.SRE_Match' objects} 126 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:1178(_validate_value) 127 | 4 0.000 0.000 0.000 0.000 {method 'group' of '_sre.SRE_Match' objects} 128 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/utils.py:266(get_content_type) 129 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/exceptions.py:80(__init__) 130 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/_bootlocale.py:23(getpreferredencoding) 131 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_response.py:292(_set_status_code) 132 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:431(__getitem__) 133 | 4 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects} 134 | 2 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.lock' objects} 135 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:195(get_parse_func) 136 | 1 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects} 137 | 2 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects} 138 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:173(__init__) 139 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:273(want_form_data_parsed) 140 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/_compat.py:166(make_literal_wrapper) 141 | 3 0.000 0.000 0.000 0.000 {method 'end' of '_sre.SRE_Match' objects} 142 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:527(headers) 143 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/json/encoder.py:204(iterencode) 144 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:894(on_exhausted) 145 | 2 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects} 146 | 3 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects} 147 | 3 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects} 148 | 2 0.000 0.000 0.000 0.000 {built-in method builtins.max} 149 | 2 0.000 0.000 0.000 0.000 {built-in method posix.getpid} 150 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:280(_line_parse) 151 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:2708(__init__) 152 | 2 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects} 153 | 1 0.000 0.000 0.000 0.000 {built-in method posix.getcwd} 154 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/flask/app.py:867(debug) 155 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wrappers/base_request.py:690(_assert_not_shallow) 156 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:328(__init__) 157 | 2 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects} 158 | 1 0.000 0.000 0.000 0.000 {built-in method posix.close} 159 | 1 0.000 0.000 0.000 0.000 {built-in method _tracemalloc.start} 160 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:880(__init__) 161 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/tempfile.py:687(__iter__) 162 | 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:583() 163 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/tempfile.py:97(_infer_return_type) 164 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/json/encoder.py:104(__init__) 165 | 1 0.000 0.000 0.000 0.000 {built-in method _locale.nl_langinfo} 166 | 1 0.000 0.000 0.000 0.000 {method 'write' of '_io.BufferedWriter' objects} 167 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:354(_fix_ie_filename) 168 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/flask/wrappers.py:81(blueprint) 169 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py:1359(__init__) 170 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/codecs.py:185(__init__) 171 | 1 0.000 0.000 0.000 0.000 /usr/local/lib/python3.6/site-packages/werkzeug/wsgi.py:913(exhaust) 172 | 1 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects} 173 | 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 174 | 1 0.000 0.000 0.000 0.000 {method 'strip' of 'bytes' objects} 175 | 176 | 177 | ######## Memory profiling. ######## 178 | [ Top 10 ] 179 | /usr/local/lib/python3.6/cProfile.py:65: size=29.4 KiB, count=248, average=122 B 180 | /usr/local/lib/python3.6/cProfile.py:55: size=23.0 KiB, count=926, average=25 B 181 | /usr/local/lib/python3.6/cProfile.py:87: size=21.6 KiB, count=262, average=84 B 182 | /usr/local/lib/python3.6/pstats.py:218: size=19.2 KiB, count=164, average=120 B 183 | /usr/local/lib/python3.6/cProfile.py:67: size=18.8 KiB, count=167, average=115 B 184 | /usr/local/lib/python3.6/tracemalloc.py:65: size=11.7 KiB, count=167, average=72 B 185 | /usr/local/lib/python3.6/cProfile.py:119: size=8088 B, count=182, average=44 B 186 | /usr/local/lib/python3.6/site-packages/werkzeug/formparser.py:518: size=5848 B, count=172, average=34 B 187 | :0: size=5038 B, count=47, average=107 B 188 | ./app.py:45: size=4742 B, count=8, average=593 B 189 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.7" 2 | services: 3 | intermediate: 4 | command: ["flask", "run", "-h", "0.0.0.0", "-p", "5000"] 5 | image: big-file-upload/intermediate:latest 6 | deploy: 7 | replicas: 1 8 | ports: 9 | - "5000:5000" 10 | links: 11 | - wdb 12 | - final 13 | volumes: 14 | - "/Users/rodrigdi/code/reanahub/playground/client-server-flask-big-file-uploads/downloads:/code/downloads" 15 | environment: 16 | FLASK_APP: app.py 17 | WDB_SOCKET_SERVER: wdb 18 | WDB_NO_BROWSER_AUTO_OPEN: "True" 19 | final: 20 | command: ["flask", "run", "-h", "0.0.0.0", "-p", "5001"] 21 | image: big-file-upload/final:latest 22 | deploy: 23 | replicas: 1 24 | ports: 25 | - "5001:5001" 26 | volumes: 27 | - "/Users/rodrigdi/code/reanahub/playground/client-server-flask-big-file-uploads/downloads:/code/downloads" 28 | links: 29 | - wdb 30 | environment: 31 | FLASK_APP: app.py 32 | WDB_SOCKET_SERVER: wdb 33 | WDB_NO_BROWSER_AUTO_OPEN: "True" 34 | wdb: 35 | image: kozea/wdb:3.2.6 36 | ports: 37 | - "1984:1984" -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Flask 2 | uwsgi 3 | Click 4 | requests 5 | ipython 6 | memory_profiler 7 | wdb 8 | -------------------------------------------------------------------------------- /uploader.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import click 4 | import requests 5 | 6 | BIG_UPLOAD_SERVER_URL = os.getenv('BIG_UPLOAD_SERVER_URL', 7 | 'http://localhost:5000/') 8 | 9 | UPLOADER_BY_TYPE = { 10 | 'request.files': lambda file, profile: requests.post(os.path.join( 11 | BIG_UPLOAD_SERVER_URL, 'request-files'), files={'file': file}, 12 | params={'profile': profile}), 13 | 'request.stream': lambda file, profile: requests.post(os.path.join( 14 | BIG_UPLOAD_SERVER_URL, 'request-stream'), 15 | data=file, 16 | headers={'Content-Type': 'application/octet-stream'}, 17 | params={'profile': profile}), 18 | } 19 | """Upload types mapping, key is type and value the endpoint.""" 20 | 21 | 22 | @click.command() 23 | @click.argument('file', type=click.File('rb')) 24 | @click.option('-t', '--upload-type', 25 | type=click.Choice(list(UPLOADER_BY_TYPE.keys()), 26 | case_sensitive=False)) 27 | @click.option('-p', '--profile', 28 | is_flag=True) 29 | def upload(file, upload_type, profile): 30 | """Upload file by chosen upload type.""" 31 | click.echo(f'Uploading {file.name} using {upload_type} ...') 32 | UPLOADER_BY_TYPE[upload_type](file, profile) 33 | click.echo(f'File {file.name} uploaded using {upload_type}.') 34 | 35 | 36 | if __name__ == '__main__': 37 | upload() 38 | -------------------------------------------------------------------------------- /uwsgi-final.ini: -------------------------------------------------------------------------------- 1 | [uwsgi] 2 | stats = /tmp/stats.socket 3 | socket = 0.0.0.0:5001 4 | module = app:app 5 | master = true 6 | processes = 2 7 | threads = 2 8 | single-interpreter = true 9 | die-on-term = true 10 | need-app = true 11 | disable-logging = true 12 | log-4xx = true 13 | log-5xx = true 14 | auto-procname = true 15 | lazy-apps = true 16 | thunder-lock = true 17 | 18 | # Workers management 19 | max-requests = 1000 20 | max-worker-lifetime = 3600 21 | reload-on-rss = 1024 -------------------------------------------------------------------------------- /uwsgi-intermediate.ini: -------------------------------------------------------------------------------- 1 | [uwsgi] 2 | stats = /tmp/stats.socket 3 | socket = 0.0.0.0:5000 4 | module = app:app 5 | master = true 6 | processes = 2 7 | threads = 2 8 | single-interpreter = true 9 | die-on-term = true 10 | need-app = true 11 | disable-logging = true 12 | log-4xx = true 13 | log-5xx = true 14 | auto-procname = true 15 | lazy-apps = true 16 | thunder-lock = true 17 | protocol=http 18 | 19 | # Workers management 20 | max-requests = 1000 21 | max-worker-lifetime = 3600 22 | reload-on-rss = 1024 --------------------------------------------------------------------------------