小编Wil*_*lva的帖子

Python:预加载内存

我有一个 python 程序,我需要在其中加载和反序列化 1GB 的 pickle 文件。这需要 20 秒,我想要一种机制,可以随时使用泡菜的内容。我看过shared_memory但它的所有使用示例似乎都涉及 numpy 而我的项目不使用 numpy。使用shared_memory或以其他方式实现这一目标的最简单和最干净的方法是什么?

这就是我现在加载数据的方式(每次运行):

def load_pickle(pickle_name):
    return pickle.load(open(DATA_ROOT + pickle_name, 'rb'))
Run Code Online (Sandbox Code Playgroud)

我希望能够在两次运行之间编辑模拟代码而无需重新加载泡菜。我一直在搞乱,importlib.reload但对于包含许多文件的大型 Python 程序来说,它似乎真的不太好用:

def main():
    data_manager.load_data()
    run_simulation()
    while True:
        try:
            importlib.reload(simulation)
            run_simulation()
        except:
        print(traceback.format_exc())
        print('Press enter to re-run main.py, CTRL-C to exit')
        sys.stdin.readline()
Run Code Online (Sandbox Code Playgroud)

python shared-memory

26
推荐指数
2
解决办法
707
查看次数

如何将属性定义为协议的一部分

有人可以澄清将属性定义为协议一部分的普遍接受的方式吗?

我一直这样做:

from typing import Protocol

class MyProtocol(Protocol):
    @property
    def my_property(self):
        """ Classes should have a my_property to conform to MyProtocol """
Run Code Online (Sandbox Code Playgroud)

但是 Pycharm 的内置 linter 不断抱怨“Getter 应该返回或产生一些东西”,因此我很困惑。引发 aNotImplementedError会使 linter 消息消失,但这样做似乎更适合抽象类而不是协议。

python python-decorators python-3.8

11
推荐指数
1
解决办法
1502
查看次数

KDB/Q内存消耗

我有一个KDB/Q数据库,每天大约有2M的记录消耗大约2G的内存.在一天结束时,它会运行一些报表,在表之间进行连接并将结果输出到磁盘上的文件中.在计算过程中,内存使用量增长到~15G.我的问题是,一旦此操作完成,内存永远不会被释放,直到DB重新启动它消耗所有15G的内存.

我想告诉KDB从内存中卸载一些表(虽然不要删除它们)但是我不想重新启动数据库,因为其他一些应用程序仍在连接它.

有没有办法告诉KDB从内存中卸载一些东西?

编辑:

如果有人发现它有趣我建议看看.Q.gc[]KDB 2.5+,看起来很有希望.

kdb

9
推荐指数
2
解决办法
5450
查看次数

Python 3.8并发.futures“OSError:句柄已关闭”

我有 Python 3.8 并且无法升级(我有仅适用于 Python 3.8 的依赖项),所以这篇 SO 帖子没有回答我的问题。我该如何防止该OSError: handle is closed错误?当将结果返回到主线程时会发生这种情况。这是一个非常简单的例子:

from concurrent.futures import ProcessPoolExecutor


def my_func(num):
    return num + 1


def worker(data):
    with ProcessPoolExecutor(5) as executor:
        result = executor.map(my_func, data)
    return result


if __name__ == "__main__":
    arr = [1, 2, 3, 4, 5]
    print(arr)
    arr = worker(arr)
    print(tuple(arr))
Run Code Online (Sandbox Code Playgroud)

这给出了

[1, 2, 3, 4, 5]
(2, 3, 4, 5, 6)
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "C:\Users\hendra11\AppData\Local\Programs\Python\Python38\lib\concurrent\futures\process.py", line 102, in _python_exit
    thread_wakeup.wakeup() …
Run Code Online (Sandbox Code Playgroud)

python-3.x concurrent.futures oserror

9
推荐指数
0
解决办法
6029
查看次数

AssertionError:将使用不支持的标签(“cp310”、“cp310”、“linux_x86_64”)构建轮子

当我尝试使用 Python 3.10 安装 numpy 时,我收到此消息。

如何解决这个问题?

  Copying numpy.egg-info to build/bdist.linux-x86_64/wheel/numpy-1.19.3-py3.10.egg-info
  running install_scripts
  Traceback (most recent call last):
    File "/home/walenty/.local/lib/python3.10/site-packages/pip/_vendor/pep517/_in_process.py", line 280, in <module>
      main()
    File "/home/walenty/.local/lib/python3.10/site-packages/pip/_vendor/pep517/_in_process.py", line 263, in main
      json_out['return_val'] = hook(**hook_input['kwargs'])
    File "/home/walenty/.local/lib/python3.10/site-packages/pip/_vendor/pep517/_in_process.py", line 204, in build_wheel
      return _build_backend().build_wheel(wheel_directory, config_settings,
    File "/tmp/pip-build-env-plb3t7s6/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 211, in build_wheel
      return self._build_with_temp_dir(['bdist_wheel'], '.whl',
    File "/tmp/pip-build-env-plb3t7s6/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 197, in _build_with_temp_dir
      self.run_setup()
    File "/tmp/pip-build-env-plb3t7s6/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 248, in run_setup
      super(_BuildMetaLegacyBackend,
    File "/tmp/pip-build-env-plb3t7s6/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 142, in run_setup
      exec(compile(code, __file__, 'exec'), locals())
    File "setup.py", line 508, …
Run Code Online (Sandbox Code Playgroud)

python numpy

7
推荐指数
1
解决办法
4039
查看次数

卷中的持久(本地)dynamoDB 数据缺乏权限 - 无法打开数据库文件

我在解决以下问题时遇到了大麻烦:我试图保留存储在本地 dynamodb 实例中的数据。我想将整个应用程序容器化在单独的容器中。

这是我的 docker-compose.yml:

version: '3.8'

services:
  dynamodb:
    image: amazon/dynamodb-local:latest
    command: -jar DynamoDBLocal.jar -sharedDb -dbPath /var/lib/dynamodb/data
    volumes:
        - dynamodb_data:/var/lib/dynamodb/data
    ports:
        - "8000:8000"

"translation-api":
    build: "./application"
    ports:
    - 5000:5000
    volumes:
    - ./application:/app
    depends_on: 
        - dynamodb
    environment:
        AWS_ACCESS_KEY_ID: 'DUMMYIDEXAMPLE'
        AWS_SECRET_ACCESS_KEY: 'DUMMYEXAMPLEKEY'

volumes:
  dynamodb_data:
Run Code Online (Sandbox Code Playgroud)

它在我的一台机器(Windows)上运行良好,但是当我将我的项目 git clone 到我的其他两台计算机(一台 Ubuntu 一台 Windows)时,我收到以下错误代码:

dynamodb_1         | May 14, 2021 10:39:52 AM com.almworks.sqlite4java.Internal log
dynamodb_1         | WARNING: [sqlite] SQLiteQueue[shared-local-instance.db]: stopped abnormally, reincarnating in 3000ms
dynamodb_1         | May 14, 2021 10:39:55 AM com.almworks.sqlite4java.Internal log
dynamodb_1         | WARNING: …
Run Code Online (Sandbox Code Playgroud)

python amazon-dynamodb docker docker-compose

7
推荐指数
1
解决办法
309
查看次数

使用 setup.py 从 git at tag 安装 python 包

我在私有 git 仓库中有一个包 (foo)。我想通过 bar 的 setup.py 安装 foo 以供另一个包 bar 使用。我想要一个特定的版本 - setup.py 中 foo 的版本匹配它的 git 标签(0.3.2,git 标签是 v0.3.2)

bar 的 setup.py 如下所示:

#!/usr/bin/env python
  
from setuptools import setup, find_packages

setup(name='bar',
        install_requires=['foo@ git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=somedir']
    )
Run Code Online (Sandbox Code Playgroud)

我还尝试在最后明确添加版本:

install_requires=['foo@ git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=somedir==0.3.2']
Run Code Online (Sandbox Code Playgroud)

我目前在我的 venv 中安装了 0.3.1 版。当我尝试安装这个 setup.py 时,通过pip install .,或者pip install . -U版本没有升级 - 甚至没有检出 repo:

Requirement already satisfied, skipping upgrade: foo@ git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src==0.3.2 from 
git+ssh://****@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src==0.3.2 in 
./venv/lib/python3.8/site-packages (from bar==0.0.0) (0.3.1)
Run Code Online (Sandbox Code Playgroud)

但是,当我直接使用pip安装foo时,升级就完成了:

pip install git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src

Collecting git+ssh://****@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src
  Cloning ssh://****@github.com/fergusmac/foo.git …
Run Code Online (Sandbox Code Playgroud)

python git pip setuptools setup.py

5
推荐指数
1
解决办法
156
查看次数

如何避免在将来在不同时间启动(非常短的)操作时启动数百个线程

do_it我使用这种方法在未来的不同时间发起几十次(不到千次)调用:

import threading
timers = []
while True:
    for i in range(20):
        t = threading.Timer(i * 0.010, do_it, [i])    # I pass the parameter i to function do_it
        t.start()
        timers.append(t)  # so that they can be cancelled if needed
    wait_for_something_else() # this can last from 5 ms to 20 seconds
Run Code Online (Sandbox Code Playgroud)

每次调用的运行时间do_it都非常快(远小于 0.1 毫秒)并且是非阻塞的。我想避免为这样一个简单的任务产生数百个新线程

我怎样才能只用一个额外的线程来处理所有do_it调用呢?

有没有一种简单的方法可以用Python来做到这一点,不需要第三方库,只有标准库?

python multithreading timer event-loop

5
推荐指数
1
解决办法
607
查看次数

如何使用libgit2创建一个空提交?

我一直在查看libgit2 C API参考,但我不知道如何模仿它的行为git commit --allow-empty.libgit2是否有内置的方法来创建空提交?如果没有,git如何在引擎盖下创建一个空提交,我应该如何使用libgit2实现相同的行为?

c git libgit2

4
推荐指数
1
解决办法
154
查看次数

替换列表中与KDB Q中的子字符串不匹配的元素

我将如何遍历KDB Q中的列表并替换不符合某些子字符串条件的元素?

逻辑示例伪代码:

list.stream()
    .forEach(x -> {
        if (x matches substring) :
            newList.add(x)
        else :
            newList.add("")
     })
Run Code Online (Sandbox Code Playgroud)

当前列表:

S: ("Lint"; "Stack"; "Linode"; "Overflow";"Linux")
Run Code Online (Sandbox Code Playgroud)

要匹配的子字符串在"Li"这里。这样,字符串“ Stack”和“ Overflow”被空字符串替换,因为它们不包含子字符串。

结果列表:

S: ("Lint"; ""; "Linode"; "";"Linux")
Run Code Online (Sandbox Code Playgroud)

kdb

3
推荐指数
2
解决办法
156
查看次数