Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# Cassandra System.OutOfMemoryException,这是一个节俭错误吗?_C#_.net_Nosql_Cassandra_Thrift - Fatal编程技术网

C# Cassandra System.OutOfMemoryException,这是一个节俭错误吗?

C# Cassandra System.OutOfMemoryException,这是一个节俭错误吗?,c#,.net,nosql,cassandra,thrift,C#,.net,Nosql,Cassandra,Thrift,我使用Cassandra 0.8.7,Aquiles作为C#client和Thrift 0.7,我试图从一个具有以下定义的超级柱族中获取大量数据: create column family SCF with column_type=Super and comparator=TimeUUIDType and subcomparator=AsciiType; 我想将从Cassandra获取的数据插入到DataTable中,这样我就能够过滤行并基于此生成一些报告,但我总是得到一个OutOfMemor

我使用Cassandra 0.8.7,Aquiles作为C#client和Thrift 0.7,我试图从一个具有以下定义的超级柱族中获取大量数据:

create column family SCF with column_type=Super and comparator=TimeUUIDType and subcomparator=AsciiType;
我想将从Cassandra获取的数据插入到DataTable中,这样我就能够过滤行并基于此生成一些报告,但我总是得到一个OutOfMemoryException

[OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.]
   Thrift.Transport.TFramedTransport.ReadFrame() +191
   Thrift.Transport.TFramedTransport.Read(Byte[] buf, Int32 off, Int32 len) +101
   Thrift.Transport.TTransport.ReadAll(Byte[] buf, Int32 off, Int32 len) +76
   Thrift.Protocol.TBinaryProtocol.ReadAll(Byte[] buf, Int32 off, Int32 len) +66
   Thrift.Protocol.TBinaryProtocol.ReadI32() +47
   Thrift.Protocol.TBinaryProtocol.ReadMessageBegin() +75
   Apache.Cassandra.Client.recv_multiget_slice() in D:\apache-cassandra-0.8.0-beta2\interface\gen-csharp\Apache\Cassandra\Cassandra.cs:304
   Apache.Cassandra.Client.multiget_slice(List`1 keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level) in D:\apache-cassandra-0.8.0-beta2\interface\gen-csharp\Apache\Cassandra\Cassandra.cs:286
我尝试了几种方法来优化我的代码,我的最终版本是分割时间段(如果它们超过了一个前缀数字,则分割键的数量),我使用这些时间段来在较小的范围内分割超级列,但什么都没有,最终我总是得到相同的异常

这可能是旧图书馆的一个错误吗?当我得到异常时,它总是指向Thrift.Transport.TFramedTransport中的以下代码部分:

private void ReadFrame()
        {
            byte[] i32rd = new byte[header_size];
            transport.ReadAll(i32rd, 0, header_size);
            int size =
                ((i32rd[0] & 0xff) << 24) |
                ((i32rd[1] & 0xff) << 16) |
                ((i32rd[2] & 0xff) <<  8) |
                ((i32rd[3] & 0xff));

            byte[] buff = new byte[size]; //Here the exception is thrown
            transport.ReadAll(buff, 0, size);
            readBuffer = new MemoryStream(buff);
        }
private void ReadFrame()
{
字节[]i32rd=新字节[头大小];
transport.ReadAll(i32rd,0,头大小);
整数大小=

((i32rd[0]&0xff)超级列系列中的数据有多大?Thrift的默认最大帧大小为15 Mb。这是在
/etc/cassandra/conf/cassandra.yaml
中设置的-您可以尝试增加它吗

请注意,无法拆分小于单个超级列的数据。

问题已解决:) 我研究了内存使用和垃圾收集器,并解决了这个问题

发生的情况是,每当我的应用程序达到1.5 GB的Ram时,就会抛出异常,因为visual studio将其编译为32位应用程序

编译和运行x64解决了问题,为了确保不使用太多内存,现在我在每次Cassandra multiget_切片调用之前添加了以下3行代码

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);

谢谢,N.

我已经尝试增加该参数。我不认为这是数据大小的问题,如果是的话,我应该在查询太大的行时总是得到异常。例如,如果我从2011-01-01查询到2011-03-31,我可能会得到异常,比如说2月28日;如果是bi的问题g数据我应该总是在2月28日得到异常,对吗?相反,如果我那天开始切片,一切都会顺利进行一段时间,我会在以后得到异常。
public static DataTable TableCreator(ref DataTable dt, ColumnParent columnParent, SlicePredicate predicate, List<byte[]> keys, CassandraClient client, int maxKeys)
{
   int keyCount = keys.Count;
   if (keyCount < maxKeys)
      CassandraMethods.CassandraToDataTable(ref dt, client.multiget_slice(keys, columnParent, predicate, ConsistencyLevel.ONE));
   else
   {
      int counter = 0;
      while (counter < keyCount)
      {
         if (counter + maxKeys <= keyCount)
            CassandraMethods.CassandraToDataTable(ref dt, client.multiget_slice(keys.GetRange(counter, maxKeys), columnParent, predicate, ConsistencyLevel.ONE));
         else
            CassandraMethods.CassandraToDataTable(ref dt, client.multiget_slice(keys.GetRange(counter, keyCount - counter), columnParent, predicate, ConsistencyLevel.ONE));
         counter += maxKeys;
      }
   }
   return dt;
}
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);