小编duo*_*gja的帖子

使用std :: string作为缓冲区有不利之处吗?

我最近看到我的一位同事std::string用作缓冲区:

std::string receive_data(const Receiver& receiver) {
  std::string buff;
  int size = receiver.size();
  if (size > 0) {
    buff.resize(size);
    const char* dst_ptr = buff.data();
    const char* src_ptr = receiver.data();
    memcpy((char*) dst_ptr, src_ptr, size);
  }
  return buff;
}
Run Code Online (Sandbox Code Playgroud)

我猜这家伙想利用返回字符串的自动销毁功能,因此他不必担心释放分配的缓冲区。

这对我来说有点奇怪,因为根据cplusplus.com,data()方法返回const char*指向由字符串内部管理的缓冲区的指针:

const char* data() const noexcept;
Run Code Online (Sandbox Code Playgroud)

Memcpying到一个const char指针?AFAIK只要知道我们所做的事情就不会造成伤害,但是我错过了什么吗?这很危险吗?

c++ stdstring c++11

68
推荐指数
6
解决办法
5812
查看次数

sizeof(空结构)和sizeof(结构与空数组)之间的区别?

我有两个结构定义如下:

struct EmptyStruct{

};

struct StructEmptyArr{
    int arr[0];
};

int main(void){
    printf("sizeof(EmptyStruct) = %ld\n", sizeof(EmptyStruct));
    printf("sizeof(StructEmptyArr) = %ld\n", sizeof(StructEmptyArr));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Ubuntu 14.04,x64上用gcc(g ++)4.8.4编译.

输出(对于gcc和g ++):

sizeof(EmptyStruct) = 1
sizeof(StructEmptyArr) = 0
Run Code Online (Sandbox Code Playgroud)

我能理解为什么sizeof(EmptyStruct)等于1但不能理解为什么sizeof(StructEmptyArr)等于0.为什么两者之间存在差异?

c c++ struct sizeof

35
推荐指数
2
解决办法
2075
查看次数

Hadoop中的分割大小与块大小

Hadoop中分割大小和块大小之间的关系是什么?正如我在阅读,分割大小必须是块大小的n倍(n是一个整数且n> 0),这是正确的吗?分割大小和块大小之间有关系吗?

hadoop mapreduce hdfs

15
推荐指数
2
解决办法
2万
查看次数

HBase regionserver被中止,之后永远不会被提起

我在HBase上使用OpenTSDB(虚拟盒上的伪分布式Hadoop)以非常高的负载(~50,000记录/秒)发送数据.系统工作了一段时间,但突然下降了.我终止了OpenTSDB和HBase.不幸的是,我再也不能把它们搞砸了.每次我尝试运行HBase和OpenTSDB时,都会显示错误日志.在这里我列出了日志:

RegionServer的:

2015-07-01 18:15:30,752 INFO  [sync.3] wal.FSHLog: Slow sync cost: 112 ms, current pipeline: [192.168.56.101:50010]
2015-07-01 18:15:41,277 INFO  [regionserver/node1.vmcluster/192.168.56.101:16201.logRoller] wal.FSHLog: Rolled WAL /hbase/WALs/node1.vmcluster,16201,1435738612093/node1.vmcluster%2C16201%2C1435738612093.default.1435742101122 with entries=3841, filesize=123.61 MB; new WAL /hbase/WALs/node1.vmcluster,16201,1435738612093/node1.vmcluster%2C16201%2C1435738612093.default.1435742141109
2015-07-01 18:15:41,278 INFO  [regionserver/node1.vmcluster/192.168.56.101:16201.logRoller] wal.FSHLog: Archiving hdfs://node1.vmcluster:9000/hbase/WALs/node1.vmcluster,16201,1435738612093/node1.vmcluster%2C16201%2C1435738612093.default.1435742061805 to hdfs://node1.vmcluster:9000/hbase/oldWALs/node1.vmcluster%2C16201%2C1435738612093.default.1435742061805
2015-07-01 18:15:42,249 INFO  [MemStoreFlusher.0] regionserver.HRegion: Started memstore flush for tsdb,,1435740133573.1a692e2668a2b4a71aaf2805f9b00a72., current region memstore size 132.20 MB
2015-07-01 18:15:42,381 INFO  [MemStoreFlusher.1] regionserver.HRegion: Started memstore flush for tsdb,,1435740133573.1a692e2668a2b4a71aaf2805f9b00a72., current region memstore size 133.09 MB
2015-07-01 18:15:42,382 WARN  [MemStoreFlusher.1] regionserver.DefaultMemStore: Snapshot called again without …
Run Code Online (Sandbox Code Playgroud)

hadoop hbase opentsdb

12
推荐指数
1
解决办法
3562
查看次数

访问速度非常快的大数据

我面临一个问题:过程工厂的数据库.采样率为50 ms时,最多有50,000个传感器.所有测量值都需要存储至少3年,并且必须支持实时查询(即用户可以查看延迟小于1秒的历史数据).我最近阅读了一篇关于时间序列数据库的文章,现有很多选项:OpenTSDB,KairosDB,InfluxDB,......

我很困惑哪一个适合这个目的?任何人都知道这个请帮助我!

更新15.06.25

今天我运行一个基于OpenTSDB的测试.我使用Virtual Box创建了一个由3个CentOS x64 VM组成的集群(1个主服务器,2个从服务器).主机配置为8 GB RAM,核心i5.主VM配置为3 GB RAM,从站配置为1.5 GB RAM.我编写了一个python程序来向OpenTSDB发送数据,如下所示:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.10.55", 4242))

start_time = time.time()
start_epoch = 1434192418;

for x in range(0, 1000000):
    curr_epoch = start_epoch + x

    tag1 = "put TAG_1 %d 12.9 stt=good\n" % (curr_epoch)
    tag2 = "put TAG_2 %d 12.9 stt=good\n" % (curr_epoch)
    tag3 = "put TAG_3 %d 12.9 stt=good\n" % (curr_epoch)
    tag4 = "put TAG_4 %d 12.9 stt=good\n" % (curr_epoch)
    tag5 = "put TAG_5 %d 12.9 …
Run Code Online (Sandbox Code Playgroud)

hbase phoenix opentsdb kairosdb influxdb

8
推荐指数
1
解决办法
898
查看次数

为什么std :: queue在弹出元素后不缩小内存?

我写了一个使用std :: queue的小程序

queue<double> the_queue;

for(int i = 0; i < 100; i++)
{
    for(int j = 0; j < 5000; j++)
    {
        double d = 1.0 * (rand() % 1000);
        the_queue.push(d);
    }
}

printf("Done pushing\n");

while(!the_queue.empty())
{
    the_queue.pop();
}

printf("Done popping\n");
Run Code Online (Sandbox Code Playgroud)

我将2个断点放在printf("Done pushing\n");并且printf("Done popping\n");在命中断点时检查程序的内存使用情况(在任务管理器中显示).在Done pushing,内存使用量约为34 MB,但Done popping内存使用量仍为~34 MB.这让我感到惊讶!

为什么是这样?有没有办法克服这个问题?

c++ queue

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

为什么结构中的引用类型的行为类似于值类型?

我是C#编程的初学者.我现在正在研究strings,structs,value typesreference types.作为公认的答案,在这里和在这里,strings是具有存储在堆栈指针,而存储在堆的实际内容的引用类型.此外,如此处所述,structs是值类型.现在,我尝试练习structsstrings用一个小例子:

struct Person
{
    public string name;
}

class Program
{
    static void Main(string[] args)
    {
        Person person_1 = new Person();
        person_1.name = "Person 1";

        Person person_2 = person_1;
        person_2.name = "Person 2";

        Console.WriteLine(person_1.name);
        Console.WriteLine(person_2.name);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码片段输出

Person 1
Person 2
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑.如果strings是引用类型并且structs是值类型,那么person_1.name和person_2.name应该指向堆上的相同空间区域,不应该是它们吗?

c# string value-type reference-type

6
推荐指数
3
解决办法
1762
查看次数

在C/C++中使用stdio文件操作时如何检测磁盘空间不足?

我正在制作一个小程序如下:

void reserve_file_space(char* file_path, size_t amount)
{
    FILE* fp = fopen(file_path, "w+b");
    if(!fp)
    {
        printf("could not create a new file\n");
        return;
    }

    int fseek_ret = fseek(fp, amount, SEEK_SET);
    if(fseek_ret != 0)
    {
        printf("could not seek to the desired position\n");
        fclose(fp);
        return;
    }

    char garbage = 1;
    size_t ret = fwrite(&garbage, 1, 1, fp);
    if(ret != 1)
    {
        printf("could not write the garbage character\n");
    }

    fclose(fp);
}

int main(int argc, char* argv[])
{
    reserve_file_space("C:\\Users\\SysPart\\Desktop\\test.bin", 1 << 30);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的 …

c c++ file-io fopen fwrite

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

检查文件内容是否已实际写入磁盘 - 未在磁盘控制器的缓冲区中排队

我写了一个程序,将两个小文件压缩成一个更大的文件.我首先从输入文件读取数据,合并数据,并将输出写入临时文件.完成后,我将临时文件重命名为所需的文件名(位于磁盘上的同一分区中).这是伪代码:

FILE* fp_1 = fopen("file_1.dat", "r+b");
FILE* fp_2 = fopen("file_2.dat", "r+b");
FILE* fp_out = fopen("file_tmp.dat", "w+b");

// 1. Read data for the key in two files
const char* data_1 = ...;
const char* data_2 = ...;

// 2. Merge data, store in an allocated buffer

// 3. Write merged buffer to temp file
fwrite(temp_buff, estimated_size, 1, fp_out);
fflush(fp_out);

fclose(fp_1);
fclose(fp_2);
fclose(fp_out);

// Now rename temp file to desired file name
if(std::rename("file_tmp.dat", "file_out.dat") == 0)
{
    std::remove("file_1.dat");
    std::remove("file_2.dat");
}
Run Code Online (Sandbox Code Playgroud)

我用两个每个5 MB的输入文件反复测试程序.有一次我通过拔掉电源线突然关闭系统.重新启动系统后,我检查了数据,发现输入文件已被删除,并且 …

c++ stdio file-handling

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

在C/C++中使用`typedef`的暗角?

我最近发现了C/C++的黑暗角落:typedef关键字不需要成为第一个单词就行了,并且知道下面所有看起来很奇怪 typedef的东西在C和C++中都是有效的,我感到很惊讶:

int typedef a;
short unsigned typedef b;
Run Code Online (Sandbox Code Playgroud)

以上typedefs相当于:

typedef int a;
typedef short unsigned b;
Run Code Online (Sandbox Code Playgroud)

并且,以下内容在C++中无效,但在C中有效:

typedef enum { c };
typedef;
typedef int;
typedef int short;
Run Code Online (Sandbox Code Playgroud)

语言设计师在C和C++中留下这个黑暗角落的原因是什么?

c c++ typedef language-lawyer

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