Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;子字符串-指向字符串范围的指针(加载大文件)_C++_String_Pointers_Ram - Fatal编程技术网

C++ C++;子字符串-指向字符串范围的指针(加载大文件)

C++ C++;子字符串-指向字符串范围的指针(加载大文件),c++,string,pointers,ram,C++,String,Pointers,Ram,我有这样一个文件: ACCCTCGGCTACTACGACTAC GCTAGTGACTGAGCATGTCAGTC TAGCTACTGACTACATCGAC gctagatgctagcgtagtctgctgagtcgt GTCAGTCATGTGTACTGACGTATTGCTATTA 上面的文件有点大,它有9000行,长度为100-200个字符 我需要在映射中插入这些行的子字符串,范围为5(整个文件必须在同一映射中) 第一行是:ACCCTCGGCTACTACGACTAC,因此我需要加载到地图:

我有这样一个文件:

  • ACCCTCGGCTACTACGACTAC
  • GCTAGTGACTGAGCATGTCAGTC
  • TAGCTACTGACTACATCGAC
  • gctagatgctagcgtagtctgctgagtcgt
  • GTCAGTCATGTGTACTGACGTATTGCTATTA
上面的文件有点大,它有9000行,长度为100-200个字符

我需要在映射中插入这些行的子字符串,范围为5(整个文件必须在同一映射中)

第一行是:ACCCTCGGCTACTACGACTAC,因此我需要加载到地图:

  • ACCTCGGCTACTACGACTAC下一步
  • ACCCTCGGCTACGACTAC下一步
  • ACCCTCGGCTACTACGACTAC next
  • ACCCTCGGCTACTACGACTAC
在此之后,我们加载第二行,第三行,直到eof

所以。我的第一个想法是:

map<string, set<string>> sequences;
int SEQLEN = 74; // cause we load 74 long substrings

while (getline(in, name) && getline(in, chain)) {
    for (int i = 0; i + SEQLEN < chain.size(); i++) {
        string subchain = chain.substr(i, SEQLEN);
        sequences[subchain].insert(name);
    }
}
map序列;
int SEQLEN=74;//因为我们加载了74个长的子字符串
while(getline(in,name)和&getline(in,chain)){
对于(int i=0;i+SEQLEN
但在此之后,我们有了一个映射,它消耗了4.5GB的RAM,这是不可接受的,因为它应该工作的PC只有2GB:C

我听说了一些“字符串字符指针”。如果存在类似的情况,我可以加载所有行并保存指向这些子字符串的“start char”和“end char”的指针,然后通过提供这个“range”来加载它们

你觉得呢,有没有类似“指向字符串的特定字符的指针”的东西


如果有人有任何想法,我将不胜感激:)

因为您的字符串编码碱基,并且您关心的是节省内存,最好的方法是完全删除字符串

字母表中有四个碱基字符,只有45或1024个可能的长度为5的子字符串。您可以通过查找将它们中的每一个编码为
short
整数,然后通过反向查找对其进行解码以输出


这种方法将为您节省大量内存:查找所需的1024个字符串数组和
std::map
将占用大约50K内存。存储每个5个字符的子字符串将花费两个字节,而不是32位系统上的14个字节或64位系统上的22个字节。您的整个文件可以存储在不到1兆字节的内存中。

如果您有一个最先进的编译器,请创建一个存储所有行的映射,并创建一个只存储第一个映射中字符串的
(开始,结束)
索引的映射。@kfx问题基本上是如何做到这一点。您的字符串是否实际编码碱基,或者它们看起来是巧合吗?是的,这是一个非常实用和实用的答案是的,这是完美的,但我的子字符串是74长,不是5:v我的错,而是+1来指出这一点:)@Kuba通过将74个字符串压缩到19个字节,你仍然可以节省4倍的内存。与其每字节存储一个字符,不如存储四个两位块,并编写一对函数,用于转换这种压缩格式。