用纯python c扩展名编写的模块,用于打开文件并缓存最近访问的行

fastfilepackage的Python项目详细描述


快速文件包

使用纯python c扩展名编写的模块,用于打开文件和 缓存最近访问的行。 有关用法示例,请参见以下文件:

  1. 测试/fastfileperformance.py
  2. 测试/fastfiletest.py
  3. 测试/getline\u c\u performance.cpp
  4. 测试/getline\u cpp_performance.cpp

安装

需要python 3pip3distutilssetuptoolswheel和 安装< <代码> 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种可供选择的文件读取实现。 他们两个, 应该有相同的性能。

  1. 您可以定义fastfile\u getline=0来使用python builtins.open()实现(默认值)
  2. 可以定义<代码> FASFILIGETGLIN = 1 使用C++ STD::GETLILE()实现< /LI>
  3. 您可以定义fastfile\u getline=2来使用posix c getline()实现

用法示例:

  1. fastfile\u getline=1 pip3安装。-v
  2. fastfile\u getline=1 fastfile\u debug=1 pip3安装。-v

文件读取优化

您可以使用环境变量fastfile_regex=1启用文件读取优化。 不要定义此变量或将其定义为fastfile\u regex=0以禁用优化。

  1. fastfile_regex=1将使用C语言内置的regex库regex.hhttps://linux.die.net/man/3/regexec
  2. fastfile_regex=2将使用pcre2 regex库pcre2.hhttp://pcre.org/current/doc/html/pcre2_match.html, 它需要安装带有sudo apt get install libpcre2 dev的libpcre2 dev
  3. fastfile_regex=3将使用re2 regex库re2/re2.hhttps://github.com/google/re2/wiki/cplusplusapi, 它需要安装re2库,其中:
    git clone https://github.com/google/re2 re2 &&cd re2 &&
    make &&
    sudo make install &&
    make testinstall
    
  4. fastfile_regex=4将使用hyperscan regex库hs.hhttps://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/
  1. https://github.com/spiside/pdb教程
  2. https://docs.python.org/3.7/library/pdb.html
  3. https://docs.python.org/3.7/library/trace.html
  4. https://stackoverflow.com/questions/1629685/when and how to use gccs stack protection feature
  5. https://stackoverflow.com/questions/25678978/how to debug python脚本that is crashing python
  6. 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命令在现有线程和 为了发现他们中的哪一个在等另一个, 即,它导致死锁或活锁。

  1. p/s 0x6ffffdf8ed0在地址上打印或内容,格式为"%s"
  2. x/100w 0x6ffffdf8ed0"检查"指定的内存地址
  3. 第0帧显示相应的堆栈帧0bt fbacktrace full
  4. bt f 5显示最后5个堆栈帧以及所有调试符号数据
  5. f 0p varnameframe 0上下文上打印varname
  6. https://stackoverflow.com/questions/14659147/如何在gdb中打印指针内容
  7. 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泄漏:

  1. cpython使用/configure--pydebug编译
  2. 使用C断言编译的运行时: 如果C断言失败(assert(…);),则崩溃(使用sigabret信号自杀)。
  3. 默认情况下,在内存分配器上使用调试挂钩, 作为pythondebug=debug环境变量: 检测内存不足和溢出 内存分配器的误用。
  4. 编译时不需要编译器优化(-og甚至-o0)以便与类似于gdb的调试器一起使用: python gdb.py应该工作得很好。 然而, 常规运行时在gdb中不可用,因为大多数变量和 函数离子参数存储在寄存器中, 因此,gdb失败,并显示<;optimized out>;消息。
  5. https://pythoncapi.readthedocs.io/runtimes.html调试生成
  6. https://stackoverflow.com/questions/40121749/why gcc og不生成源代码行映射
  7. https://stackoverflow.com/questions/8650972/how-do-i-debug-refcounts-in-a-python-c-extension-the-east-way

在cygwin上生成核心转储而不是堆栈跟踪

export CYGWIN="$CYGWIN error_start=dumper -d %1 %2"
  1. https://stackoverflow.com/questions/320001/using-a-stackdump-from-cygwin-executable

如果在运行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

  1. http://cygwin.1069669.n5.nabble.com/debugging-with-gdb-td94421.html

许可证

请参阅文件license.txt

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将字符串转换为自定义对象   java如何从socket方法获取数据?   Java中的soap读取回车和新行   java在单击时替换图像   java推荐的使用RXJava执行异步任务的方法   java MySql连接器JDBC驱动程序不支持连接池吗?   java将活动堆栈清理到顶部   java计数用户输入的数量   java从webservice下载大文件导致应用程序性能问题   JavaLocalDate。EPOCH不可用   java如何在使用Selenium等待一定时间后,在页面无法加载(get(url))时自动刷新页面   java Calendar setLenient方法不允许检查年份字段的健全性   java Eclipse和intelliJ 安卓 SDK问题   java为什么我可以在没有super关键字的情况下调用父方法?   java iText的PDF格式不好