如何上传大文件(≥3GB)到FastAPI后端?

2024-03-08

我正在尝试将大文件(≥3GB)上传到我的 FastAPI 服务器,without将整个文件加载到内存中,因为我的服务器只有 2GB 可用内存。

服务器端:

async def uploadfiles(upload_file: UploadFile = File(...):

客户端:

m = MultipartEncoder(fields = {"upload_file":open(file_name,'rb')})
prefix = "http://xxx:5000"
url = "{}/v1/uploadfiles".format(prefix)
try:
    req = requests.post(
    url,
    data=m,
    verify=False,
            )

返回:

HTTP 422 {"detail":[{"loc":["body","upload_file"],"msg":"field required","type":"value_error.missing"}]}

我不知道什么MultipartEncoder实际上发送到服务器,因此请求不匹配。有任何想法吗?


With requests-toolbelt图书馆,你必须通过filename同样,在声明时field for upload_file, 也set the Content-Type header—这是您收到错误的主要原因,因为您在发送请求时没有设置Content-Type标头至multipart/form-data,然后是必要的boundary https://stackoverflow.com/questions/3508338/what-is-the-boundary-in-multipart-form-data字符串——如图所示文档 https://toolbelt.readthedocs.io/en/latest/uploading-data.html。例子:

filename = 'my_file.txt'
m = MultipartEncoder(fields={'upload_file': (filename, open(filename, 'rb'))})
r = requests.post(url, data=m, headers={'Content-Type': m.content_type})
print(r.request.headers)  # confirm that the 'Content-Type' header has been set

但是,我不建议使用库(即requests-toolbelt https://github.com/requests/toolbelt)已经三年多没有提供新版本了。我建议改用 Python requests,如中所示这个答案 https://stackoverflow.com/a/70657621/17865804 and 那个答案 https://stackoverflow.com/a/70641755/17865804(另见流式上传和块编码请求 https://requests.readthedocs.io/en/latest/user/advanced/#streaming-uploads),或者最好使用HTTPX https://github.com/encode/httpx/库,它支持async请求(如果您必须同时发送多个请求)以及流式传输File默认情况下上传,这意味着一次只会加载一个块到内存中(请参阅文档 https://www.python-httpx.org/advanced/#multipart-file-encoding)。下面给出示例。

选项 1(快速)- 上传File and Form数据使用.stream()

正如之前详细解释的这个答案 https://stackoverflow.com/a/70667530/17865804,当你声明一个UploadFile https://fastapi.tiangolo.com/tutorial/request-files/#uploadfile对象 FastAPI/Starlette 在底层使用了SpooledTemporaryFilemax_size属性设置为1MB,这意味着文件数据将在内存中进行假脱机处理,直到文件大小超过max_size,此时内容被写入磁盘;更具体地说,对于一个temporary文件位于操作系统的临时目录中 - 请参阅这个答案 https://stackoverflow.com/a/71377044/17865804关于如何查找/更改默认临时目录 - 您稍后需要使用以下命令从中读取数据.read()方法。因此,整个过程使得上传文件变得非常慢;特别是,如果它是一个大文件(正如您稍后将在下面的选项 2 中看到的那样)。

为了避免这种情况并加快这一过程,正如上面链接的答案所建议的,人们可以访问request身体如溪流。按照星光文档 https://www.starlette.io/requests/#body,如果您使用.stream() https://github.com/encode/starlette/blob/b8ea367b4304a98653ec8ce9c794ad0ba6dcaf4b/starlette/requests.py#L208方法中,提供(请求)字节块,而不将整个主体存储到内存(如果主体大小超过 1MB,则稍后存储到临时文件)。此方法允许您在字节块到达时读取和处理它们。下面通过使用建议的解决方案更进一步streaming-form-data https://github.com/siddhantgoel/streaming-form-data库,它提供了一个用于解析流的Python解析器multipart/form-data输入块。这意味着不仅您可以上传Form数据连同File(s),但您也不必等待接收到整个请求正文才能开始解析数据。完成的方法是初始化主解析器类(传递 HTTP 请求headers有助于确定输入Content-Type,因此,boundary https://stackoverflow.com/questions/3508338/what-is-the-boundary-in-multipart-form-data用于分隔多部分有效负载中的每个主体部分等的字符串),并关联其中一个Target https://streaming-form-data.readthedocs.io/en/latest/#target-classes类来定义从请求正文中提取字段后应如何处理该字段。例如,FileTarget https://streaming-form-data.readthedocs.io/en/latest/#filetarget会将数据流式传输到磁盘上的文件,而ValueTarget https://streaming-form-data.readthedocs.io/en/latest/#valuetarget将数据保存在内存中(此类可用于Form or File数据,如果您不需要将文件保存到磁盘)。也可以定义自己的custom Target classes https://streaming-form-data.readthedocs.io/en/latest/#custom-target-classes。我不得不提的是streaming-form-data https://github.com/siddhantgoel/streaming-form-data库目前不支持async调用 I/O 操作,意味着发生块写入sync错误地(在一个def功能)。不过,正如下面的端点使用的那样.stream() https://github.com/encode/starlette/blob/b8ea367b4304a98653ec8ce9c794ad0ba6dcaf4b/starlette/requests.py#L208(这是一个async函数),它将放弃对在事件循环上运行的其他任务/请求的控制,同时等待数据从流中变得可用。您还可以在单​​独的线程中运行用于解析接收到的数据的函数,await它,使用 Starlette 的run_in_threadpool() https://github.com/encode/starlette/blob/b8ea367b4304a98653ec8ce9c794ad0ba6dcaf4b/starlette/concurrency.py#L35—e.g., await run_in_threadpool(parser.data_received, chunk)——当您调用时,FastAPI 在内部使用它async的方法UploadFile, 如图所示here https://github.com/encode/starlette/blob/f6ea760a80d8b109fb6afd1c03e9a33754e6bb5f/starlette/datastructures.py#L456。欲了解更多详情def vs async def,请看一下这个答案 https://stackoverflow.com/a/71517830/17865804.

您还可以执行某些验证任务,例如,确保输入大小不超过特定值。这可以使用以下方法完成MaxSizeValidator https://github.com/siddhantgoel/streaming-form-data/blob/d900c1f750896e7221d7896aab4ff892b91730a2/streaming_form_data/validators.py#L5。但是,由于这只会应用于您定义的字段,因此它不会阻止恶意用户发送极大的请求正文,这可能会导致消耗服务器资源,从而导致应用程序最终崩溃。下面包含一个自定义MaxBodySizeValidator用于确保请求正文大小不超过预定义值的类。上面描述的两个验证器以一种可能比所描述的更好的方式解决了限制上传文件(以及整个请求正文)大小的问题here https://github.com/tiangolo/fastapi/issues/362#issuecomment-584104025,它使用UploadFile,因此,在执行检查之前,需要完全接收文件并将其保存到临时目录(更不用说该方法根本不考虑请求主体大小)——用作 ASGI 中间件,例如this https://github.com/steinnes/content-size-limit-asgi将是限制请求正文的替代解决方案。另外,如果您正在使用独角兽与独角兽 https://fastapi.tiangolo.com/deployment/server-workers/#gunicorn-with-uvicorn-workers,您还可以定义限制,例如,请求中 HTTP 标头字段的数量、HTTP 请求标头字段的大小等(请参阅文档 https://docs.gunicorn.org/en/stable/settings.html?highlight=limit#security)。使用反向代理服务器时可以应用类似的限制,例如 Nginx(它还允许您使用client_max_body_size http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size指示)。

以下示例的一些注释。由于它使用Request直接反对,而不是UploadFile and Form对象,端点将不会正确记录在自动生成的文档中/docs(如果这对您的应用程序很重要)。这也意味着您必须自己执行一些检查,例如是否收到端点的必填字段,以及它们是否采用预期格式。例如,对于data字段,您可以检查是否data.value是否为空(空意味着用户未将该字段包含在multipart/form-data,或发送一个空值),以及 ifisinstance(data.value, str)。对于文件,您可以检查是否file_.multipart_filename不为空;然而,自从一个filename可能不会被包含在Content-Disposition https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#as_a_header_for_a_multipart_body对于某些用户,您可能还想检查文件是否存在于文件系统中,使用os.path.isfile(filepath)(注意:您需要确保指定位置不存在同名文件;否则,上述函数将始终返回True,即使用户没有发送文件)。

关于所应用的尺寸限制,MAX_REQUEST_BODY_SIZE下面必须大于MAX_FILE_SIZE(加上所有Form值大小)您期望收到的原始请求正文(您通过使用.stream()方法)包括更多的字节--boundary and Content-Disposition正文中每个字段的标头。因此,您应该添加更多字节,具体取决于Form值和您期望收到的文件数量(因此MAX_FILE_SIZE + 1024 below).

app.py

from fastapi import FastAPI, Request, HTTPException, status
from streaming_form_data import StreamingFormDataParser
from streaming_form_data.targets import FileTarget, ValueTarget
from streaming_form_data.validators import MaxSizeValidator
import streaming_form_data
from starlette.requests import ClientDisconnect
import os

MAX_FILE_SIZE = 1024 * 1024 * 1024 * 4  # = 4GB
MAX_REQUEST_BODY_SIZE = MAX_FILE_SIZE + 1024

app = FastAPI()

class MaxBodySizeException(Exception):
    def __init__(self, body_len: str):
        self.body_len = body_len

class MaxBodySizeValidator:
    def __init__(self, max_size: int):
        self.body_len = 0
        self.max_size = max_size

    def __call__(self, chunk: bytes):
        self.body_len += len(chunk)
        if self.body_len > self.max_size:
            raise MaxBodySizeException(body_len=self.body_len)
 
@app.post('/upload')
async def upload(request: Request):
    body_validator = MaxBodySizeValidator(MAX_REQUEST_BODY_SIZE)
    filename = request.headers.get('Filename')
    
    if not filename:
        raise HTTPException(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, 
            detail='Filename header is missing')
    try:
        filepath = os.path.join('./', os.path.basename(filename)) 
        file_ = FileTarget(filepath, validator=MaxSizeValidator(MAX_FILE_SIZE))
        data = ValueTarget()
        parser = StreamingFormDataParser(headers=request.headers)
        parser.register('file', file_)
        parser.register('data', data)
        
        async for chunk in request.stream():
            body_validator(chunk)
            parser.data_received(chunk)
    except ClientDisconnect:
        print("Client Disconnected")
    except MaxBodySizeException as e:
        raise HTTPException(status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE, 
           detail=f'Maximum request body size limit ({MAX_REQUEST_BODY_SIZE} bytes) exceeded ({e.body_len} bytes read)')
    except streaming_form_data.validators.ValidationError:
        raise HTTPException(status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE, 
            detail=f'Maximum file size limit ({MAX_FILE_SIZE} bytes) exceeded') 
    except Exception:
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, 
            detail='There was an error uploading the file') 
   
    if not file_.multipart_filename:
        raise HTTPException(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail='File is missing')

    print(data.value.decode())
    print(file_.multipart_filename)
        
    return {"message": f"Successfuly uploaded {filename}"}

如前所述,要上传数据(在客户端),您可以使用HTTPX库,默认情况下支持流式文件上传,因此允许您发送大型流/文件,而无需将它们完全加载到内存中。您可以通过额外Form数据也是如此,使用data争论。下面是一个自定义标头,即Filename,用于将文件名传递给服务器,以便服务器实例化FileTarget具有该名称的类(您可以使用X-如果您愿意,自定义标头的前缀;然而,它是官方不再推荐 https://stackoverflow.com/questions/3561381/custom-http-headers-naming-conventions).

要上传多个文件,请为每个文件使用标头(或者,在服务器端使用随机名称,文件完全上传后,您可以选择使用file_.multipart_filename属性),传递文件列表,如中所述文档 https://www.python-httpx.org/advanced/#multipart-file-encoding(注意:为每个文件使用不同的字段名称,以便在服务器端解析它们时它们不会重叠,例如,files = [('file', open('bigFile.zip', 'rb')),('file_2', open('bigFile2.zip', 'rb'))],最后定义Target相应地在服务器端提供类。

test.py

import httpx
import time

url ='http://127.0.0.1:8000/upload'
files = {'file': open('bigFile.zip', 'rb')}
headers={'Filename': 'bigFile.zip'}
data = {'data': 'Hello World!'}

with httpx.Client() as client:
    start = time.time()
    r = client.post(url, data=data, files=files, headers=headers)
    end = time.time()
    print(f'Time elapsed: {end - start}s')
    print(r.status_code, r.json(), sep=' ')

两者都上传File and JSON body

如果您想上传两个文件)和 JSON 而不是Form数据,您可以使用方法3中描述的方法这个答案 https://stackoverflow.com/a/70640522/17865804,从而也使您无需对收到的信息执行手动检查Form字段,如前所述(有关更多详细信息,请参阅链接的答案)。为此,请对上面的代码进行以下更改。

app.py

#...
from fastapi import Form
from pydantic import BaseModel, ValidationError
from typing import Optional
from fastapi.encoders import jsonable_encoder

#...

class Base(BaseModel):
    name: str
    point: Optional[float] = None
    is_accepted: Optional[bool] = False
  
def checker(data: str = Form(...)):
    try:
        return Base.parse_raw(data)
    except ValidationError as e:
        raise HTTPException(detail=jsonable_encoder(e.errors()), status_code=status.HTTP_422_UNPROCESSABLE_ENTITY)
        

@app.post('/upload')
async def upload(request: Request):
    #...
    
    # place the below after the try-except block in the example given earlier
    model = checker(data.value.decode())
    print(dict(model))

test.py

#...
import json

data = {'data': json.dumps({"name": "foo", "point": 0.13, "is_accepted": False})}
#...

选项 2(慢)- 上传File and Form数据使用UploadFile and Form

如果你想使用普通的def相反,参见端点这个答案 https://stackoverflow.com/questions/63048825/how-to-upload-file-using-fastapi/70657621#70657621.

app.py

from fastapi import FastAPI, File, UploadFile, Form, HTTPException, status
import aiofiles
import os

CHUNK_SIZE = 1024 * 1024  # adjust the chunk size as desired
app = FastAPI()

@app.post("/upload")
async def upload(file: UploadFile = File(...), data: str = Form(...)):
    try:
        filepath = os.path.join('./', os.path.basename(file.filename))
        async with aiofiles.open(filepath, 'wb') as f:
            while chunk := await file.read(CHUNK_SIZE):
                await f.write(chunk)
    except Exception:
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, 
            detail='There was an error uploading the file')
    finally:
        await file.close()

    return {"message": f"Successfuly uploaded {file.filename}"}

如前所述,使用此选项将需要更长的时间才能完成文件上传,并且HTTPX使用 5 秒的默认超时,您很可能会得到ReadTimeout异常(因为服务器需要一些时间来读取SpooledTemporaryFile分块并将内容写入磁盘上的永久位置)。因此,您可以配置超时 https://www.python-httpx.org/advanced/#timeout-configuration(参见Timeout https://github.com/encode/httpx/blob/9baf3a6cd2fa9ebeb17dba5a3e5c6e9e0af83a96/httpx/_config.py#L189源代码中的类),更具体地说,readtimeout,它“指定等待接收数据块(例如响应正文的块)的最大持续时间”。如果设置为None而不是一些正数值,不会有超时read.

test.py

import httpx
import time

url ='http://127.0.0.1:8000/upload'
files = {'file': open('bigFile.zip', 'rb')}
headers={'Filename': 'bigFile.zip'}
data = {'data': 'Hello World!'}
timeout = httpx.Timeout(None, read=180.0)

with httpx.Client(timeout=timeout) as client:
    start = time.time()
    r = client.post(url, data=data, files=files, headers=headers)
    end = time.time()
    print(f'Time elapsed: {end - start}s')
    print(r.status_code, r.json(), sep=' ')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何上传大文件(≥3GB)到FastAPI后端? 的相关文章

  • 尽管极其懒惰,但如何在 Python 中模拟 IMAP 服务器?

    我很好奇是否有一种简单的方法来模拟 IMAP 服务器 例如imaplib模块 在Python中 without做很多工作 是否有预先存在的解决方案 理想情况下 我可以连接到现有的 IMAP 服务器 进行转储 并让模拟服务器在真实的邮箱 电子
  • Django REST序列化器:创建对象而不保存

    我已经开始使用 Django REST 框架 我想做的是使用一些 JSON 发布请求 从中创建一个 Django 模型对象 然后使用该对象而不保存它 我的 Django 模型称为 SearchRequest 我所拥有的是 api view
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 访问selenium中的css类属性

    我有一个 HTML div 元素并希望使用 Selenium 检查它是否左对齐 但是 那float leftCSS 属性在 CSS 类中定义 有什么方法可以通过 Selenium 访问 CSS 类属性吗 或者还有其他方法可以获取这个值吗 d
  • jQuery mobile - Pagecontainer 从 DOM 中消失

    在 jQuery mobile 中 我想从外部文件加载页面容器 我可以将标记添加到我的 DOM 中 但之后我面临的问题是 一旦导航到 page2 整个 page1 div 就会从 DOM 中消失 因此我无法返回 请参见下面的屏幕截图 单击
  • 如何从iPhone sdk中的城市名称获取位置(坐标)?

    friends 因为我们在android中有google api的geocoder getfromlocation locationname maximumResults 函数 我在 iphone sdk 中没有看到这样的函数来从城市名称获
  • 在 Linux 中调试 C++ 程序

    我写了一个简单的 C 程序 如下所示 include
  • 截断文本并在鼠标悬停时显示它

    我需要截断文本 末尾带有 并且将鼠标悬停在整个文本上时应该展开 我尝试用下面的代码截断 此代码的问题是 它会在单击时展开内容 但我需要当用户将鼠标悬停在 p 标签上的任何位置时打开它 var len 100 var p document g
  • 阻止滚动以及展开/折叠可折叠工具栏

    我正在使用Collapsible Toolbar在我的应用程序中 活动启动时可折叠工具栏处于展开状态 启用滚动并且正常工作 但现在我需要显示全屏错误布局 以防我的 API 失败 在这种情况下 我必须折叠工具栏并阻止滚动效果 错误布局显示重试
  • Spark hivecontext 的查询会锁定 hive 表吗?

    我知道如果我从 Hive 提交查询 将获取共享锁 然后 Hive 表将被查询锁定 https cwiki apache org confluence display Hive Locking https cwiki apache org c
  • 实现下拉菜单项颤动的复选框

    如何在flutter应用程序中实现下拉菜单项的复选框 每个里面DropdownMenuItem 你可以有Row作为一个孩子 你可以通过CheckBox其次是Text 帮助您入门的示例工作代码 body Center child Dropdo
  • 获取 ntp 调整通知

    我的情况很奇怪 我需要一些有关 NTP 时间调整的指导 我有一台运行 NTP 守护进程的 PC Red Hat 这台 PC 通过 LAN 上的 Stratum 2 时间服务器调整其时间 我的 PC 还通过串行端口 RS 232 连接到 DV
  • 如何将 Vec<&mut T> 转换为 Vec<&T>?

    我有一个可变引用向量 struct T let mut mut vec Vec lt mut T gt vec 如何将它 的副本 传递到采用不可变引用向量的函数中 fn cool func mut immut vec Vec lt T gt
  • iPad IOS html 表单选择在触摸时无法打开

    我有一个选择框 通过以下方式创建
  • Vim 加载 vimrc 后是否加载插件?

    我正在尝试覆盖插件中设置的突出显示 该插件执行以下操作 highlight link WordUnderTheCursor Underlined 首先 我不知道 添加到highlight做任何事 但这无关紧要 在 vimrc 中做类似的事情
  • 使用异步函数订阅可观察对象是否安全

    我有一个以 50Hz 发送事件的事件发射器 我想使用异步方法订阅这个发射器 代码如下所示 this emitter fromEventPattern this addHandler this removeHandler err char g
  • org.hibernate.MappingException:属性映射在 ENUM 实体中的列数错误

    我创建了数据库 其中引用了 ENUM 表 并且该枚举的实体有例外 脚本示例 CREATE TABLE status code VARCHAR 40 status ENUM not started in progress finished i
  • 从 jquery 安全地调用我的 Web api

    我有一个简单的问题 可能会指出一个复杂的答案 我有一个运行良好的网络 API 但现在我想设置身份验证 授权 我需要它在所有平台上工作 但主要来自 jQuery 当然 我不想像这样以纯文本形式沿着管道发送我的用户名和密码 function G
  • 有没有办法加快 docker exec 的速度?

    有没有办法消除 docker exec 的开销 例如 当我打电话时docker exec ls在已经运行的容器上 需要0 15秒才能返回结果 root min time docker exec 6f ls bin boot dev etc
  • 制作 Silverlight 和常规 .NET REST 客户端的最便携方法是什么

    我正在尝试让服务器应用程序使用 WCF 公开一些状态信息 特别是我在使用带有 RESTful API 的 WCF 服务之后 当谈到从 silverlight 中使用 REST api 时 我遇到了一些困难 我想要作为附加类型的客户端的应用程
  • 如何在M1 Mac上安装Deepface(Python人脸识别包)?

    我正在尝试使用 deepface python 库 我已经按照中列出的指南安装了张量流https claytonpilat medium com tutorial tensorflow on an m1 mac using jupyter
  • 使用 Python 多处理的高内存使用率

    我看过几篇关于使用 Python 多处理模块的内存使用情况的帖子 然而这些问题似乎并不能回答我在这里遇到的问题 我将我的分析发表出来 希望有人能帮助我 Issue 我正在使用多处理并行执行任务 我注意到工作进程的内存消耗无限增长 我有一个小
  • 如何上传大文件(≥3GB)到FastAPI后端?

    我正在尝试将大文件 3GB 上传到我的 FastAPI 服务器 without将整个文件加载到内存中 因为我的服务器只有 2GB 可用内存 服务器端 async def uploadfiles upload file UploadFile