我正在尝试了解的某些shared_memory
操作。
查看源代码,看起来该模块shm_open()
用于UNIX环境,并且Windows上的CreateFileMapping
\ OpenFileMapping
与结合使用mmap
。
我从这里了解到,为了避免通过进行彻底的序列化/反序列化pickle
,必须为他的共享数据类型实现__setstate__()
并__getstate__()
明确实现。
我在中看不到任何此类实现shared_memory.py
。
如何shared_memory
避开泡菜处理?
而且,在Windows机器上,仅此一项似乎在所有解释器中都可以幸免:
from mmap import mmap
shared_size = 12
shared_label = "my_mem"
mmap(-1, shared_size , shared_label)
Run Code Online (Sandbox Code Playgroud)
为什么在这里需要CreateFileMapping
\ OpenFileMapping
?
我正在序列化列数据,然后通过套接字连接发送它.就像是:
import array, struct, socket
## Socket setup
s = socket.create_connection((ip, addr))
## Data container setup
ordered_col_list = ('col1', 'col2')
columns = dict.fromkeys(ordered_col_list)
for i in range(num_of_chunks):
## Binarize data
columns['col1'] = array.array('i', range(10000))
columns['col2'] = array.array('f', [float(num) for num in range(10000)])
.
.
.
## Send away
chunk = b''.join(columns[col_name] for col_name in ordered_col_list]
s.sendall(chunk)
s.recv(1000) #get confirmation
Run Code Online (Sandbox Code Playgroud)
我希望将计算与发送分开,将它们放在单独的线程或进程上,这样我就可以在数据被发送时继续进行计算.
我把二值化部分作为生成器函数,然后将生成器发送到一个单独的线程,然后通过队列产生二进制块.
我从主线程中收集了数据并将其发送出去.就像是:
import array, struct, socket
from time import sleep
try:
import thread
from Queue import Queue
except:
import _thread …
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过套接字连接打包和发送列数据。
为了加快速度,我考虑过将包装(struct.pack
)分成多个过程。
为了避免两种方式的腌制,我认为最好由打包过程自己发送数据,因为据说可以从Python 3.4开始腌制套接字对象。
这是我正在工作的简化版本:
import socket
from multiprocessing import Pool
from struct import pack
# Start and connect a socket
s = socket.socket()
s.connect((ip, port))
# Data to be packed and sent in this order
data1 = 1, 2, 3, 4
data2 = 5, 6, 7, 8
data3 = 9, 10, 11, 12
# Top level column packer/sender for mp.pool
def send_column(column):
return s.send(pack(f'{len(column)}i', *column))
pool = Pool()
# Will this necessarily send the data in order? …
Run Code Online (Sandbox Code Playgroud) 我试图了解将一堆以某种方式预先排列的字符串添加到 Listbox 小部件的最快方法是什么,以便每个字符串都在一个新行中。
到目前为止我能收集到的最快的:
from Tkinter import *
strings= 'str1', 'str2', 'str3'
listbox=Listbox(None)
[listbox.insert(END, item) for item in strings]
listbox.pack()
Run Code Online (Sandbox Code Playgroud)
是否有一种更干净、更快的方法来完成它,而无需遍历每个字符串?也许如果字符串以某种方式或使用其他方法预先打包?
如果相关,我想用它来显示目录列表。
我读到RawArray
可以在进程之间共享而无需复制,并且想了解它在 Python 中是如何实现的。
我在sharedctypes.py中看到, a是从heap.pyRawArray
中的a 构造的,然后用 取消。BufferWrapper
ctypes.memset
BufferWrapper
由一个对象组成Arena
,该对象本身是由一个mmap
(或 Windows 中的 100 个 mmap,请参见heap.py中的第 40 行)构建的
我读到mmap
系统调用实际上是在Linux/BSD中用于分配内存的,而Python模块在windows中使用MapViewOfFile 。
mmap
那么看起来很方便。它似乎可以直接与mp.pool
-
from struct import pack
from mmap import mmap
def pack_into_mmap(idx_nums_tup):
idx, ints_to_pack = idx_nums_tup
pack_into(str(len(ints_to_pack)) + 'i', shared_mmap, idx*4*total//2 , *ints_to_pack)
if __name__ == '__main__':
total = 5 * 10**7
shared_mmap = mmap(-1, total * 4)
ints_to_pack = range(total)
pool = …
Run Code Online (Sandbox Code Playgroud) 我想使用IFileOperation从 python 代码复制文件 -
在 Windows 10 上,Python 3.8 -
import ctypes
ctypes.windll.shell32.IFileOperation
Run Code Online (Sandbox Code Playgroud)
似乎不存在。
我怎样才能使用IFileOperation
(不是已弃用的SHFileOperation
API)ctypes
?
我看了Brandon Rhodes关于Cython的演讲 - "EXE的日子在我们身上".
布兰登在09:30提到,对于一段特定的短代码,跳过解释给出了40%的加速,而跳过分配和发送则给出了574%的加速(10:10).
我的问题是 - 如何测量特定的代码?是否需要手动提取底层c命令,然后以某种方式使运行时运行它们?
这是一个非常有趣的观察,但我如何重新创建实验呢?
python dynamic-programming performance-testing cython dispatch
我在这里(第 147 行)看到它使用:
os.read(0,32)
Run Code Online (Sandbox Code Playgroud)
谷歌说 0 代表标准输入,但从标准输入读取的公认答案是通过
sys.stdin.buffer.read()
Run Code Online (Sandbox Code Playgroud)
我想知道两者之间有什么区别。哪个更快?哪个版本更便携?
如果这是一个菜鸟问题,我道歉,但我找不到任何相关的参考 -
这两者有什么区别?
如果我想使用pyarrow从hdfs读取镶木地板文件,我会使用哪一个?
我知道我可以使用pyarrow连接到HDFS群集 pyarrow.hdfs.connect()
我也知道我可以利用读取拼花文件pyarrow.parquet
的read_table()
但是,read_table()
接受一个文件路径,而hdfs.connect()
给我一个HadoopFileSystem
实例。
是否可以仅使用pyarrow(安装了libhdfs3)来获取驻留在HDFS集群中的拼花文件/文件夹?我希望获得的是to_pydict()
函数,然后可以传递数据。
我有一个顶级函数,它获取一个包含镶木地板文件路径和列名称的元组.
该函数只加载文件中的列,转换为pandas,而不是将其打包/序列化为标准格式.就像是:
import pyarrow as pa
import pyarrow.parquet as pq
from multiprocessing import Pool
def binarizer(file_data_tuple):
''' Read a Parquet column a file, binarize and return'''
path, col_name, col_meta, native = file_data_tuple
if not native:
# Either this or using a top level hdfs_con
hdfs_con = pa.hdfs.connect(params)
read_pq = pq.read_table if native else hdfs_con.read_parquet
arrow_col = read_pq(filepath, columns = (col_name,))
bin_col = imported_binarizng_function(arrow_col)
return bin_col
def read_binarize_parallel(filepaths):
''' Setup parallel reading and binarizing of a parquet file'''
# list of …
Run Code Online (Sandbox Code Playgroud) sysv_ipc
我希望以便携的方式使用该库。
我安装了它:
pip3 install sysv_ipc
然后从Python:
import sysv_ipc
sysv_ipc.__file__
# Output:
# /home/x/.local/lib/python3.9/site-packages/sysv_ipc.cpython-39-x86_64-linux-gnu.so
Run Code Online (Sandbox Code Playgroud)
如果我将该文件复制到文件夹(pip uninstall
库),然后从该文件夹打开 python 并尝试相同的导入,则会失败。
我尝试检查还安装了哪些内容,结果发现:
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info
/home/x/.local/lib/python3.9/site-packages/sysv_ipc.cpython-39-x86_64-linux-gnu.so
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/INSTALLER
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/LICENSE
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/METADATA
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/RECORD
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/REQUESTED
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/WHEEL
/home/x/.local/lib/python3.9/site-packages/sysv_ipc-1.1.0.dist-info/top_level.txt
Run Code Online (Sandbox Code Playgroud)
我也没有在setup.py中找到线索。
我想弄清楚的是——
sysv_ipc
pip 如何/在哪里与要从该特定文件导入的Python 相关?
我看到节点 10 支持 BigInt。但是,Buffer 类中没有 ReadBigInt() 功能。
有可能以某种方式绕过它吗?也许读取 2 个整数,将它们转换为 BigInt,移动上面的一个并将它们相加以重建 bigint?