用纯python c扩展名编写的模块,用于打开文件并缓存最近访问的行
fastfilepackage的Python项目详细描述
快速文件包
使用纯python c扩展名编写的模块,用于打开文件和 缓存最近访问的行。 有关用法示例,请参见以下文件:
- 测试/fastfileperformance.py
- 测试/fastfiletest.py
- 测试/getline\u c\u performance.cpp
- 测试/getline\u cpp_performance.cpp
安装
需要python 3
,
pip3
,distutils
,setuptools
,wheel
和
安装< <代码> C++ 11 编译器:
sudo apt-get install build-essential g++ python3-dev python3 python3-pip
pip3 install setuptools wheel
然后,可以使用以下命令克隆此存储库:
git clone https://github.com/evandrocoan/fastfilepackage
cd fastfilepackage
pip3 install .
或者安装时使用:
pip3 install fastfilepackage
alternive文件读取
有3种可供选择的文件读取实现。 他们两个, 应该有相同的性能。
- 您可以定义
fastfile\u getline=0
来使用python builtins.open()实现(默认值) - 您可以定义
fastfile\u getline=2
来使用posix c getline()实现
用法示例:
fastfile\u getline=1 pip3安装。-v
fastfile\u getline=1 fastfile\u debug=1 pip3安装。-v
文件读取优化
您可以使用环境变量fastfile_regex=1
启用文件读取优化。
不要定义此变量或将其定义为fastfile\u regex=0
以禁用优化。
fastfile_regex=1
将使用C语言内置的regex库regex.h
: https://linux.die.net/man/3/regexecfastfile_regex=2
将使用pcre2 regex库pcre2.h
: http://pcre.org/current/doc/html/pcre2_match.html, 它需要安装带有sudo apt get install libpcre2 dev的libpcre2 dev
包fastfile_regex=3
将使用re2 regex库re2/re2.h
: https://github.com/google/re2/wiki/cplusplusapi, 它需要安装re2
库,其中:git clone https://github.com/google/re2 re2 &&cd re2 && make && sudo make install && make testinstall
fastfile_regex=4
将使用hyperscan regex库hs.h
: https://github.com/intel/hyperscan, 它需要安装带有sudo apt get install libhyperscan dev的libhyperscan dev
包
注意:
- 定义变量
fastfile_regex
仅在设置了fastfile_getline=2
时才有效(值为2)。 如果变量fastfile\u getline=2
未定义(作为/具有值2)。 任何fastfile\u regex的定义都将被忽略。
调试
您可以使用enable debug mode
部分中指定的fastfile\u debug=1
变量,
您不需要使用cflags="-o0…"cxxflags="-o0…"/usr/bin/pip3安装来构建程序。
因为这些标志已经由
fastfile\u debug=1
如果python出现分段错误, 你需要安装调试符号包, 并将程序编译成模式调试。 这些指令对linux和 CygWin。
sudo apt-get install python3-dbg
apt-cyg install libcrypt-devel python36-devel python36-debuginfo python3-debuginfo python3-cython-debuginfo
CFLAGS="-O0 -g -ggdb -fstack-protector-all" CXXFLAGS="-O0 -g -ggdb -fstack-protector-all" /usr/bin/pip3 install .
cd modulename/source
gdb --args /usr/bin/python3 -m modulename.__init__ -p ../tests/light/
python3 -m pdb -m modulename.__init__ -p ../tests/light/
cd /usr/bin
/usr/bin/python3 -u -m trace -t modulename-script.py -p ../tests/light/
- https://github.com/spiside/pdb教程
- https://docs.python.org/3.7/library/pdb.html
- https://docs.python.org/3.7/library/trace.html
- https://stackoverflow.com/questions/1629685/when and how to use gccs stack protection feature
- https://stackoverflow.com/questions/25678978/how to debug python脚本that is crashing python
- https://stackoverflow.com/questions/46265835/how-to-debug-a-python-module-run-with-python-m-from-the-command-line
如果程序进入死锁(或livelock)状态,
您可以使用gdb
来发现或发现正在发生的事情。
为此,
首先,您需要以某种方式获取系统的核心转储文件。
一旦得到核心转储文件,
您可以调用gdb program_name coredump
。
现在,
您可以使用gdb
命令在现有线程和
为了发现他们中的哪一个在等另一个,
即,它导致死锁或活锁。
p/s 0x6ffffdf8ed0
在地址上打印或内容,格式为"%s"x/100w 0x6ffffdf8ed0
"检查"指定的内存地址第0帧
显示相应的堆栈帧0
为bt f
(backtrace full
)bt f 5
显示最后5个堆栈帧以及所有调试符号数据f 0
和p varname
在frame 0
上下文上打印varname
- https://stackoverflow.com/questions/14659147/如何在gdb中打印指针内容
- https://stackoverflow.com/questions/14502236/how-to-view-a-pointer-like-an-array-in-gdb
gdb--args program\u name
直接运行程序
一旦进入gdb
命令行,
您可以使用run
命令和
一旦程序进入/启动死锁或活锁,
您可以按ctrl+c
停止程序执行。
然后,
gdb
将已经"捕获"了核心dum文件
启用调试模式
默认的调试级别是0
,其中没有将调试消息代码生成到最终二进制文件中。
保证最大性能。
如果要编译包含调试消息的二进制文件,
在运行安装程序之前,请定义环境变量fastfile\u debug
。
您可以在文件source/debugger.h中看到可用的调试级别:
FASTFILE_DEBUG=1 pip install .
FASTFILE_DEBUG=1 pip install -e .
FASTFILE_DEBUG=1 python setup.py install
FASTFILE_DEBUG=1 python setup.py develop
如果你在窗户上, 按如下方式运行:
set "FASTFILE_DEBUG=1" && pip install .
set "FASTFILE_DEBUG=1" && pip install -e .
set "FASTFILE_DEBUG=1" && python setup.py install
set "FASTFILE_DEBUG=1" && python setup.py develop
调试refcounts
泄漏:
- cpython使用
/configure--pydebug编译
- 使用C断言编译的运行时: 如果C断言失败(
assert(…);
),则崩溃(使用sigabret信号自杀)。- 默认情况下,在内存分配器上使用调试挂钩, 作为
pythondebug=debug
环境变量: 检测内存不足和溢出 内存分配器的误用。- 编译时不需要编译器优化(
-og
甚至-o0
)以便与类似于gdb
的调试器一起使用:python gdb.py
应该工作得很好。 然而, 常规运行时在gdb
中不可用,因为大多数变量和 函数离子参数存储在寄存器中, 因此,gdb
失败,并显示<;optimized out>;
消息。- https://pythoncapi.readthedocs.io/runtimes.html调试生成
- https://stackoverflow.com/questions/40121749/why gcc og不生成源代码行映射
- https://stackoverflow.com/questions/8650972/how-do-i-debug-refcounts-in-a-python-c-extension-the-east-way
- 使用C断言编译的运行时: 如果C断言失败(
在cygwin上生成核心转储而不是堆栈跟踪
export CYGWIN="$CYGWIN error_start=dumper -d %1 %2"
如果在运行gdb时看到这一点:
[New Thread 8980.0x626c]
[New Thread 8980.0x1ba0]
[New Thread 8980.0x2454]
[New Thread 8980.0x3fbc]
warning: the debug information found in "/usr/lib/debug//usr/bin/cygwin1.dbg" does not match "/usr/bin/cygwin1.dll" (CRC mismatch).
[New Thread 8980.0x21c4]
运行命令rm/usr/lib/debug//usr/bin/cygwin1.dbg
许可证
请参阅文件license.txt