Google的Protocol缓冲区使用C++标准字符串类std::string作为可变大小字节数组(参见此处),类似于Python,其中字符串类也用作字节数组(至少在Python 3.0之前).
这种方法似乎很好:
但我很好奇:这是C++中字节数组的首选方式吗?这种方法的缺点是什么(超过几秒static_cast)
我喜欢LWN文章"Crash-only software",我想了解更多关于崩溃安全和容错编程的知识.
令人惊讶的是,很难确保持久状态在故障情况下是一致的.在这里,我甚至不讨论分布式操作:在单个节点上也很难:如果系统崩溃,即使是正常的Berkeley DB(BDB数据存储或BDB并发数据存储)也可能有一个被破坏的数据库.不仅高级应用程序约束被破坏,如果系统崩溃,数据库可能无法正确打开.
什么是关于崩溃安全和容错设计,方法和编程的良好资源.
如果资源专注于C++和POSIX环境,我将不胜感激.
我在Java中搜索像NFS这样的网络(或分布式)文件系统的实现.目标是扩展它并用它做一些研究.在网络上我发现了一些实现,例如DJ NFS,但开放的问题是它们的成熟和快速程度.
任何人都可以有一个良好的起点,有没有人经历过这样的事情?
PS我知道Hadoop DFS并且我将它用于某些项目,但是Hadoop并不适合我想要做的事情.
--EDIT-- Hadoop真正专注于高度可扩展的高吞吐量计算,没有覆盖文件部分的可能性.目标是您可以使用文件系统,例如用户主目录.
--EDIT--更多细节:想法是修改这样的实现,以便文件不直接存储在本地文件系统上,而是应用重复数据删除.
我将一个中等大小的应用程序从C转移到C++.它不会处理异常,也不会改变.
我(错误!)对C++的理解是(直到我昨天很难学会),(默认)new运算符在分配问题时返回NULL指针.然而,直到1993年(左右)才真实.如今,它会抛出一个std :: bad_alloc异常.
是否有可能在不重写所有内容的情况下返回旧行为,在每次调用时使用std :: nothrow?
在x86/64(Intel/AMD 64位)处理器上,在字边界上对齐的变量是否比未对齐的加载操作更快?
我的一位同事辩称,未对齐的载荷很慢,应该避免.他引用了项目填充到结构中的单词边界,作为未对齐加载缓慢的证明.例:
struct A {
char a;
uint64_t b;
};
Run Code Online (Sandbox Code Playgroud)
结构A通常大小为16个字节.
另一方面,Snappy压缩器的文档指出Snappy假设"未对齐的32位和64位加载和存储很便宜".根据源代码,英特尔32和64位处理器也是如此.
那么:这里的真相是什么?如果和未对齐的载荷减少多少?在哪种情况下?
这里有一些C++代码可以从多个线程并行访问.它有一个关键部分:
lock.Acquire();
current_id = shared_id;
// small amounts of other code
shared_id = (shared_id + 1) % max_id;
lock.Release();
// do something with current_id
Run Code Online (Sandbox Code Playgroud)
lock变量的类是POSIX互斥实现的包装器.由于模块操作,不可能使用原子操作.
带有O3标志的gcc编译器是否可能优化代码,以便在锁定之前移动current_id的赋值?
某些 POSIX 函数不是线程安全的。示例包括目录名和路径名。
dirname() 函数不需要是可重入的。不需要可重入的函数不需要是线程安全的。
在某些平台上,目录名和路径名有可重入版本:dirname_r和 pathname_r。据我发现,Linux 上的目录名和路径名没有可重入版本。
对于我的一个项目,我想分析大约2 TB的Protobuf对象.我想通过"大象鸟"库在Pig脚本中使用这些对象.但是,我不清楚如何将文件写入HDFS,以便ProtobufPigLoader类可以使用它.
这就是我所拥有的:
猪脚本:
register ../fs-c/lib/*.jar // this includes the elephant bird library
register ../fs-c/*.jar
raw_data = load 'hdfs://XXX/fsc-data2/XXX*' using com.twitter.elephantbird.pig.load.ProtobufPigLoader('de.pc2.dedup.fschunk.pig.PigProtocol.File');
Run Code Online (Sandbox Code Playgroud)
导入工具(部分):
def getWriter(filenamePath: Path) : ProtobufBlockWriter[de.pc2.dedup.fschunk.pig.PigProtocol.File] = {
val conf = new Configuration()
val fs = FileSystem.get(filenamePath.toUri(), conf)
val os = fs.create(filenamePath, true)
val writer = new ProtobufBlockWriter[de.pc2.dedup.fschunk.pig.PigProtocol.File](os, classOf[de.pc2.dedup.fschunk.pig.PigProtocol.File])
return writer
}
val writer = getWriter(new Path(filename))
val builder = de.pc2.dedup.fschunk.pig.PigProtocol.File.newBuilder()
writer.write(builder.build)
writer.finish()
writer.close()
Run Code Online (Sandbox Code Playgroud)
导入工具运行正常.我有一些ProtobufPigLoader的问题因为我不能使用hadoop-lzo压缩库,并且没有修复(见这里)ProtobufPigLoader不起作用.我遇到问题的问题是DUMP raw_data;退货Unable to open …
DTrace是源自Solaris的令人印象深刻,功能强大的跟踪系统,但它被移植到FreeBSD和Mac OSX.
DTrace使用名为D的高级语言,与AWK或C不同.以下是一个示例:
io:::start
/pid == $1/
{
printf("file %s offset %d size %d block %llu\n", args[2]->fi_pathname,
args[2]->fi_offset, args[0]->b_bcount, args[0]->b_blkno);
}
Run Code Online (Sandbox Code Playgroud)
使用命令行sudo dtrace -q -s <name>.d <pid>记录源自该进程的所有IO.
我的问题是,是否以及如何在跟踪本身期间从DTrace脚本调用自定义C函数以使用该跟踪数据执行高级操作.
该项目是一个包含核心库代码,测试和示例代码的库.在构建过程结束时,应创建以下存档:
xy-1.1.0-core.jarxy-1.1.0-tests.jarxy-1.1.0-examples.jar用maven设置它的最佳方法是什么?目前的设置是:
src
src/main/java
src/examples/java
src/test/java
Run Code Online (Sandbox Code Playgroud)
此外,应该有一个lib包含所有依赖项的目录.应将xy-jars,库jar和其他脚本打包到发布文件中xy-1.1.0.tar.gz.
_mm256_mul_ps是“乘法打包单精度(32 位)浮点元素”的 Intel 内在函数。_mm256_mul_ph是“乘法打包半精度(16 位)浮点元素”的内在函数。
我可以_mm256_mul_ps使用 using 来调用use std::arch::x86_64::*;,例如
#[inline]
fn mul(v: __m256, w: __m256) -> __m256 {
unsafe { _mm256_mul_ps(v, w) }
}
Run Code Online (Sandbox Code Playgroud)
不过,似乎很难调用_mm256_mul_ph。可以调用_mm256_mul_phRust 吗?
我使用了fread函数,我得到了一个4的缓冲区和一个"读错误".
为什么我buffer不是fileSize?
这是我的代码:
FILE *fp;
char* buffer;
fp = fopen("help.txt","r");
if (fp == NULL){
fputs("Can't open Help file, Help.txt",stderr);
exit(1);
}
fseek(fp, 0, SEEK_END);
long fileSize = ftell(fp);
rewind(fp);
buffer = (char*) malloc (sizeof(char)*fileSize);
if(buffer == NULL){
fputs("Memory Allocation Error",stderr);
exit(2);
}
size_t result = fread(buffer,1,fileSize,fp);
if(result != fileSize){
fputs("Reading error\n",stderr);
printf("File Size : %lu\n",fileSize);
printf("Result : %lu\n",result);
printf("Buffer Size : %u\n",sizeof(buffer));
exit(3);
}
fputs(buffer,stdout);
fclose(fp);
free (buffer);
Run Code Online (Sandbox Code Playgroud)
这是我运行程序时的输出:
Reading error
File Size : 224
Result …Run Code Online (Sandbox Code Playgroud) c++ ×6
c ×2
filesystems ×2
java ×2
posix ×2
alignment ×1
apache-pig ×1
avx512 ×1
build ×1
concurrency ×1
crash ×1
dtrace ×1
elephantbird ×1
file-io ×1
hadoop ×1
intrinsics ×1
linux ×1
maven-2 ×1
runtime ×1
rust ×1
x86-64 ×1