我有一个 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) 有人可以澄清将属性定义为协议一部分的普遍接受的方式吗?
我一直这样做:
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 消息消失,但这样做似乎更适合抽象类而不是协议。
我有一个KDB/Q数据库,每天大约有2M的记录消耗大约2G的内存.在一天结束时,它会运行一些报表,在表之间进行连接并将结果输出到磁盘上的文件中.在计算过程中,内存使用量增长到~15G.我的问题是,一旦此操作完成,内存永远不会被释放,直到DB重新启动它消耗所有15G的内存.
我想告诉KDB从内存中卸载一些表(虽然不要删除它们)但是我不想重新启动数据库,因为其他一些应用程序仍在连接它.
有没有办法告诉KDB从内存中卸载一些东西?
编辑:
如果有人发现它有趣我建议看看.Q.gc[]KDB 2.5+,看起来很有希望.
我有 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.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) 我在解决以下问题时遇到了大麻烦:我试图保留存储在本地 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) 我在私有 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) 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来做到这一点,不需要第三方库,只有标准库?
我一直在查看libgit2 C API参考,但我不知道如何模仿它的行为git commit --allow-empty.libgit2是否有内置的方法来创建空提交?如果没有,git如何在引擎盖下创建一个空提交,我应该如何使用libgit2实现相同的行为?
我将如何遍历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) python ×6
git ×2
kdb ×2
c ×1
docker ×1
event-loop ×1
libgit2 ×1
numpy ×1
oserror ×1
pip ×1
python-3.8 ×1
python-3.x ×1
setup.py ×1
setuptools ×1
timer ×1