小编Bre*_*itt的帖子

流数据的高效(基本)正则表达式实现

我正在寻找一个对数据流进行操作的正则表达式匹配的实现 - 也就是说,它有一个API,允许用户一次传入一个字符并报告何时在字符流上找到匹配项到目前为止看到了 只需要非常基本的(经典的)正则表达式,因此基于DFA/NFA的实现似乎非常适合于该问题.

基于在单个线性扫描中使用DFA/NFA进行正则表达式匹配的事实,似乎应该可以实现流式实现.

要求:

  • 图书馆应尝试等到满弦一直在进行比赛之前被读取.我的数据确实是流媒体; 没有办法知道有多少数据会到达,无法向前或向后搜索.

  • 为一些特殊情况实现特定的流匹配不是一种选择,因为我事先并不知道用户可能想要查找哪些模式.

  • 语言:可从C/C++中使用

对于好奇,我的用例如下:我有一个系统拦截整个系统模拟器中的内存写入,我想有一种方法来识别与正则表达式匹配的内存写入(例如,可以使用它来找到系统中将URL写入内存的点.

我已经找到:

在Stream上应用正则表达式?

将正则表达式应用于Java I/O流

Code Guru - 使用.NET Framework构建正则表达式流搜索

但所有这些尝试首先将流转换为字符串,然后使用库存正则表达式库.

我的另一个想法是修改RE2库,但根据作者的说法,它的构建围绕着整个字符串同时在内存中的假设.

如果没有什么可用,那么我可以开始重新发明这个轮子的不愉快的道路,以满足我自己的需要,但我真的不愿意,如果我可以避免它.任何帮助将不胜感激!

regex stream dfa nfa

8
推荐指数
2
解决办法
2568
查看次数

在numpy/scipy中为稀疏的矩阵添加一个非常重复的矩阵?

我试图实现与NumPy/SciPy的一个函数来计算詹森-香农散单(培训)向量和大量其他(观察)向量之间.观察向量存储在非常大的(500,000x65536)Scipy稀疏矩阵中(密集矩阵不适合存储器).

作为算法的一部分,我需要计算T +ø 对于每个观测矢量O,,其中T是训练向量.我无法使用NumPy的常规广播规则找到一种方法,因为稀疏矩阵似乎不支持那些(如果T保留为密集阵列,Scipy会尝试使稀疏矩阵首先密集,哪些运行内存不足;如果我将T变成稀疏矩阵,则T + O i失败,因为形状不一致).

目前,我正在采取将训练向量平铺为500,000x65536稀疏矩阵的非常低效的步骤:

training = sp.csr_matrix(training.astype(np.float32))
tindptr = np.arange(0, len(training.indices)*observations.shape[0]+1, len(training.indices), dtype=np.int32)
tindices = np.tile(training.indices, observations.shape[0])
tdata = np.tile(training.data, observations.shape[0])
mtraining = sp.csr_matrix((tdata, tindices, tindptr), shape=observations.shape)
Run Code Online (Sandbox Code Playgroud)

但是当它只存储~1500个"真实"元素时,它占用了大量的内存(大约6GB).构建起来也很慢.

我试图通过使用stride_tricks使CSR矩阵的indptr变得聪明,数据成员不会在重复数据上使用额外的内存.

training = sp.csr_matrix(training)
mtraining = sp.csr_matrix(observations.shape,dtype=np.int32)
tdata = training.data
vdata = np.lib.stride_tricks.as_strided(tdata, (mtraining.shape[0], tdata.size), (0, tdata.itemsize))
indices = training.indices
vindices = np.lib.stride_tricks.as_strided(indices, (mtraining.shape[0], indices.size), (0, indices.itemsize))
mtraining.indptr = np.arange(0, len(indices)*mtraining.shape[0]+1, len(indices), dtype=np.int32)
mtraining.data = vdata
mtraining.indices = vindices
Run Code Online (Sandbox Code Playgroud)

但是,这并不工作,因为跨入意见mtraining.data和mtraining.indices是错误的形状(根据 …

python numpy matrix scipy sparse-matrix

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

尽管配置了 CONFIG_COMPAT,但在 aarch64 上运行 32 位 ARM 二进制文件仍无法正常工作

我有一台 64 位 ARM 机器,我想在其上运行 32 位 ARM 二进制文件。作为测试用例,我使用arm-linux-gnueabihf-gcc工具链为 32 位 ARM 构建了一个小型 hello world。file显示为:

root@ubuntu:/home/ubuntu# file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=61ffe5e22117a6d4c2ae37a1f4c76617d3e5facc, not stripped
Run Code Online (Sandbox Code Playgroud)

但尝试运行它会产生:

root@ubuntu:/home/ubuntu# ./hello
bash: ./hello: cannot execute binary file: Exec format error
Run Code Online (Sandbox Code Playgroud)

根据之前的问题,我检查了内核是否是使用该CONFIG_COMPAT选项构建的,结果是:

root@ubuntu:/home/ubuntu# grep CONFIG_COMPAT= /boot/config-$(uname -r)
CONFIG_COMPAT=y
Run Code Online (Sandbox Code Playgroud)

我还验证了armhf架构已添加并且armhf加载程序的版本存在。请注意,加载程序本身也不运行:

root@ubuntu:/home/ubuntu# dpkg --print-foreign-architectures
armhf
root@ubuntu:/home/ubuntu# dpkg -l libc6:armhf
Desired=Unknown/Install/Remove/Purge/Hold
| …
Run Code Online (Sandbox Code Playgroud)

linux arm arm64

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

标签 统计

arm ×1

arm64 ×1

dfa ×1

linux ×1

matrix ×1

nfa ×1

numpy ×1

python ×1

regex ×1

scipy ×1

sparse-matrix ×1

stream ×1