我正在使用一个大矩阵(250x250x30 = 1,875,000个单元格),我想要一种方法为这个矩阵中的每个单元设置任意数量的标志,这种方式易于使用且空间效率合理.
我最初的计划是一个250x250x30列表数组,其中每个元素都是这样的:["FLAG1","FLAG8","FLAG12"].然后我将其改为仅存储整数:[1,8,12].这些整数由getter/setter函数在内部映射到原始标志字符串.这仅使用250mb,每点8个标志,这在内存方面很好.
我的问题是:我是否错过了构建此类数据的另一种明显方法?
谢谢大家的建议.我最后将一些建议合而为一,遗憾的是,我只能选择一个答案而不得不与其他人一起生活:
编辑:我在这里使用的初始代码(使用集合作为3d numpy数组的基本元素)使用了大量内存.这个新版本在填充时使用大约500mb randint(0,2**1000).
import numpy
FLAG1=2**0
FLAG2=2**1
FLAG3=2**2
FLAG4=2**3
(x,y,z) = (250,250,30)
array = numpy.zeros((x,y,z), dtype=object)
def setFlag(location,flag):
array[location] |= flag
def unsetFlag(location,flag):
array[location] &= ~flag
Run Code Online (Sandbox Code Playgroud) 我正在设计一个数据库,并在考虑是否需要一对多的关系.传统上我已经完成了正常的PK(作为GUID)并建立了关系,但我想知道如果这样做,为什么不使用按位标志作为PK.
这种关系会丢失,但数据本身会描述这种关系.
示例 - 我有一个组表和一个用户表.用户可以拥有一个或多个组:
+------------------------+
| Groups |
+------------------------+
| PK | Display Name |
+---------+--------------+
| 1 | Group A |
| 2 | Group B |
| 4 | Group C |
+---------+--------------+
+------------------------+
| Users |
+------------------------+
| Name | Groups |
+---------+--------------+
| Fred | 1 | // Fred is only in Group A
| Jim | 3 | // Jim is in Groups A & B
| Sam | 7 | // Sam is …Run Code Online (Sandbox Code Playgroud) 我有这样的[Flags]枚举:
[Flags]
public enum Status
{
None = 0,
Active = 1,
Inactive = 2,
Unknown = 4
}
Run Code Online (Sandbox Code Playgroud)
状态枚举可能包含两个值,例如:
Status s = Status.Active | Status.Unknown;
Run Code Online (Sandbox Code Playgroud)
现在我需要创建一个linq查询(LINQ to ADO.NET Entities)并询问状态为s的记录,即Active或Unknown;
var result = from r in db.Records
select r
where (r.Status & (byte)s) == r.Status
Run Code Online (Sandbox Code Playgroud)
当然我得到一个错误,因为LINQ to Entities只知道在Where子句中处理原始类型.
错误是:
无法创建"闭包类型"类型的常量值.在此上下文中仅支持原始类型(例如Int32,String和Guid').
有可行的方法吗?我可能有一个状态枚举,有10个可能的值,并查询5个状态.如何以优雅的方式使用Flags枚举构造查询?
谢谢.
更新
这似乎是一个Linq to Entities问题.我认为在LINQ to SQL中它可以工作(不确定,没有经过测试).
位标志有点难以理解:)
我知道这个和这个问题,我确实理解答案,我甚至从我的一个好朋友那里听过这篇文章.
但是当我需要"渐进"超过标准时,我仍然无法弄明白......
我想要做的是这样的:
if (HttpContext.Current.Session["DebugSessionText"] != null)
{
showType = parDebug.Write2LogType.WARN |
parDebug.Write2LogType.ERROR |
parDebug.Write2LogType.INFO;
if (!chkInfo.Checked)
showType &= ~parDebug.Write2LogType.INFO; // remove INFOs
if (!chkError.Checked)
showType &= ~parDebug.Write2LogType.ERROR; // remove ERRORs
List<myDebugRow> list =
(List<myDebugRow>)HttpContext.Current.Session["DebugSessionText"];
gv.DataSource = list.FindAll(x => x.Type == showType));
}
gv.DataBind();
Run Code Online (Sandbox Code Playgroud)
我确实需要过滤一个List对象,所以我可以得到用户想要的东西(仅显示INFO错误,异常错误,但始终会显示WARNing错误)...
有没有直接的方法来做到这一点,或者我需要手动过滤它而不使用LAMBDA表达式?
谢谢你的帮助.
我使用了dovecot筛的imap4flag插件:http://wiki.dovecot.org/LDA/Sieve#Flagging_or_Highlighting_your_mail
该标志在雷鸟中正确显示,但我搜索如何获取标志以在圆形立方体中显示它们.
提前致谢.
在我的程序中,我运行了一些线程.每个线程都获得一个指向某个对象的指针(在我的程序中 - 向量).每个线程都会修改矢量.
有时我的程序会因为segm-fault而失败.我以为它发生了,因为线程A开始用向量做某事而线程B还没有用它完成操作?它真的可以吗?
我该怎么办呢?线程同步?或者也可以制作一个标志,VectorIsInUse并在使用它时将此标志设置为true?
我正在运行Ubuntu 11.04 64位.我已经安装了OpenMPI.我正在尝试构建以下代码,这是来自Gropp/Lusk/Skjellum的"使用MPI"一书中的测试问题的片段:
#include <math.h>
#include "mpi.h"
int main(int argc, char *argv[])
{
int size, rank;
MPI::Init(argc, argv);
size = MPI::COMM_WORLD.Get_size();
rank = MPI::COMM_WORLD.Get_rank();
MPI::Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从终端,我可以使用mpicc包装器来检索我在机器上编译和链接所需的以下信息:
$ mpicc --showme:compile
-I/usr/lib/openmpi/include -I/usr/lib/openmpi/include/openmpi -pthread
$ mpicc --showme:link
-pthread -L/usr/lib/openmpi/lib -lmpi -lopen-rte -lopen-pal -ldl -Wl,--export-dynamic -lnsl -lutil -lm -ldl
Run Code Online (Sandbox Code Playgroud)
我可以成功编译代码.但是,链接失败.这是我的编译器和链接器步骤:
make all
Building file: ../main.cpp
Invoking: GCC C++ Compiler
mpicc -I/usr/lib/openmpi/include -I/usr/lib/openmpi/include/openmpi -O0 -g3 -Wall -c -fmessage-length=0 -pthread -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"
Finished building: ../main.cpp
Building …Run Code Online (Sandbox Code Playgroud) 交叉使用外部工具链别名编译库的buildroot code sourcery lite 2011导致
output/host/opt/ext-toolchain/bin/../lib/gcc/arm-none-linux-gnueabi/4.6.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
由于明显缺失 libgcc_s.a
# find . -iname "libgcc*"
./output/host/usr/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so
./output/host/usr/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/armv4t/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/armv4t/lib/libgcc_s.so
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/thumb2/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/thumb2/lib/libgcc_s.so
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/lib/libgcc_s.so
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/armv4t/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/armv4t/libgcc_eh.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/plugin/libgcc
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/thumb2/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/thumb2/libgcc_eh.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/libgcc_eh.a
Run Code Online (Sandbox Code Playgroud)
有没有办法绕过这个问题,但仍然静态链接?是否有CLFAGS或LDFLAGS选项可以静态链接所有内容除外libgcc_s?
到目前为止尝试的东西(除了阅读适用的部分ld和gcc手册页):
CFLAGS="-static -static-libgcc"
CFLAGS="-static -shared-libgcc"
CFLAGS="-static -static-libgcc -Wl,-Bstatic"
CFLAGS="-static -shared-libgcc -Wl,-Bstatic"
Run Code Online (Sandbox Code Playgroud)
添加后-Wl,-lgcc_s,-Bstatic我得到了大量的未定义/未知符号...(-Bshared不是有效的选项说ld)
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libgio-2.0.a(libgio_2_0_la-glocalfileinfo.o): In function `_g_local_file_info_get':
glocalfileinfo.c:(.text+0x2d90): warning: Using 'getgrgid' in statically linked applications requires at runtime the shared libraries from …Run Code Online (Sandbox Code Playgroud) 几天前我遇到了一个非常愚蠢的错误.它是由我从第三方库获得的枚举引起的:
[Flags]
public enum MyStatus
{
OKResponse = 0,
ResponseTooBig = 1,
ErrorMessage = 2,
NoResponse = 4,
...
}
Run Code Online (Sandbox Code Playgroud)
我习惯用这种方式检查标志:
if ((status & MyStatus.OKResponse) != 0) {...}
Run Code Online (Sandbox Code Playgroud)
但它不起作用MyStatus.OKResponse,因为它是零.它根本不是一面旗帜,它缺少所有旗帜.当然,当我发现错误时,我意识到这OKResponse是唯一的非错误状态,所以它的确意味着"没有错误,没有标志".但是,我真的不觉得这很明显.
在标志枚举中将0定义为值之一是一个坏习惯吗?推荐的方式是什么?检查标志的最佳方法是什么,也可以使用"无标志"标志?