小编Fan*_*ius的帖子

使用预先计算的字典在小块中进行无损压缩

我有一个应用程序,我正在阅读和写入数小块数据(几百字节)数亿次.我想基于示例数据文件生成压缩字典,并在读取和写入小块时永远使用该字典.我倾向于LZW压缩算法.维基百科页面(http://en.wikipedia.org/wiki/Lempel-Ziv-Welch)列出了压缩和解压缩的伪代码.修改它看起来相当简单,因此字典创建是一个单独的代码块.所以我有两个问题:

  1. 我是在正确的轨道还是有更好的方法?
  2. 为什么LZW算法在解压缩步骤中会添加到字典中?我可以省略它,还是会在字典中失去效率?

谢谢.

更新: 现在我认为理想的情况是找到一个库,让我将字典与压缩数据分开存储.这样的事情存在吗?

更新: 我最终获取了http://www.enusbaum.com/blog/2009/05/22/example-huffman-compression-routine-in-c中的代码 并进行了调整.我是该页面评论中的克里斯.我通过电子邮件将我的mod发回给了博客作者,但我还没有收到回复.我用这个代码看到的压缩率并不令人印象深刻.也许这是由于8位树的大小.

更新: 我将其转换为16位,压缩效果更好.它也比原始代码快得多.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Book.Core
{
  public class Huffman16
  {
    private readonly double log2 = Math.Log(2);

    private List<Node> HuffmanTree = new List<Node>();

    internal class Node
    {
      public long Frequency { get; set; }
      public byte Uncoded0 { get; set; }
      public byte Uncoded1 { get; set; }
      public uint Coded { get; set; }
      public int CodeLength { …
Run Code Online (Sandbox Code Playgroud)

compression algorithm

16
推荐指数
1
解决办法
3873
查看次数

试图通过SSL创建一个简单的Ruby服务器

我试图在Ruby中创建一个简单的SSL客户端和服务器.但我收到一个神秘的错误消息,文档没有任何帮助.

这是我的服务器代码:

#!/usr/bin/ruby

require "gserver"
require "openssl"

listeningPort = Integer(ARGV[0])

class Server < GServer
  def initialize(listeningPort)
    @sslContext = OpenSSL::SSL::SSLContext.new
    @sslContext.cert = OpenSSL::X509::Certificate.new(File.open("MyCert.pem"))
    super(listeningPort, "0.0.0.0")
  end
  def serve(io)
    begin
      ssl = OpenSSL::SSL::SSLSocket.new(io, @sslContext)
      ssl.sync_close = true
      ssl.connect
      while (lineIn = ssl.gets)
        lineIn = lineIn.chomp
        $stdout.puts "=> " + lineIn
        lineOut = "You said: " + lineIn
        $stdout.puts "<= " + lineOut
        ssl.puts lineOut
      end
    rescue
      $stderr.puts $!
    end
  end
end

server = Server.new(listeningPort)
server.start
server.join
Run Code Online (Sandbox Code Playgroud)

客户端代码类似:

#!/usr/bin/ruby

require "socket"
require "thread" …
Run Code Online (Sandbox Code Playgroud)

ruby openssl client-server

14
推荐指数
1
解决办法
9544
查看次数

抑制C#垃圾回收

我的应用程序分配了大量的内存(数百万个小对象,总计几千兆字节)并且长时间保留它.

  1. 是.NET浪费时间检查所有这些数据来做GC吗?
  2. Gen 2 GC多久出现一次(检查所有对象的那个)?
  3. 有没有办法降低它的频率或暂时抑制它的发生?
  4. 我确切地知道当我准备好收集大量内存时,有什么方法可以优化它吗?我目前正在调用GC.Collect(); GC.WaitForPendingFinalizers(); 那时候.

更新:Perf计数器"GC中的%时间"显示平均值为10.6%.

c# garbage-collection

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

在C + MinGW32中使用64位地址执行文件操作

我试图在C中读取24 GB的XML文件,但它不起作用.当我读到它时,我正在使用ftell()打印出当前位置,但是一旦它达到足够大的数字,它就会回到一个小数字并重新开始,甚至从未获得20%的文件.我认为这是用于存储位置(长)的变量范围的问题,根据http://msdn.microsoft.com/en-us/library/s3f49ktz(VS),它可以达到大约4,000,000,000..80).aspx,而我的文件大小为25,000,000,000字节.一个很长的长期应该工作,但我怎么能改变我的编译器(Cygwin/mingw32)使用或得到它有fopen64?

cygwin mingw large-file-support

9
推荐指数
1
解决办法
1398
查看次数

如何从作为管理员用户运行的C#代码重新启动IIS?

通常(在Windows 7中),安装程序将要求修改系统的权限.作为管理员,我可以在不提供密码的情况下授予授权.

我试图找出如何从作为AN管理员的用户运行的C#代码中采取管理员操作(重新启动IIS),而不是"管理员"帐户.

.net c# iis admin windows-7

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

如何编译64位Windows的现有posix代码?

我没有使用Cygwin或MinGW,但我需要最终得到64位代码,而不是32位代码.这是因为我将从64位托管C#调用DLL.我似乎无法找到设置这些工具来创建64位二进制文​​件的好参考.如果GCC是版本4,而不是我的Cygwin安装版本3,那将是很好的.

另一种方法是进行某种形式的进程间通信.我会研究这个,但我上面列出的是我真正想要的.

64-bit cygwin win64 mingw

6
推荐指数
1
解决办法
9489
查看次数

构建数据库以进行扩展就绪的最佳实践

我知道这是一个非常通用和主观的问题,所以如果它不符合StackOverflow网络礼节,请随意投票关闭它...但对我来说,值得尝试;)

我从来没有建立过高流量的应用程序,所以我不知道(除了网上的一些阅读)关于扩展实践.

如何设计一个数据库,当需要扩展时,我不必重构数据库结构或应用程序代码?

我知道开发(和优化)应该逐步进行,在发生时优化瓶颈,并且当你不知道你将拥有多少用户以及他们将如何使用时,几乎不可能设计出完美的结构.数据库(例如读/写比率),我只是想找个好的基础来开始.

没有什么方法让几乎可以与缩放结构的最佳实践partitioningsharding,什么hacks必须绝对避免?

编辑我的应用程序的一些细节:

  1. 该应用程序将作为多站点行为运行
  2. 我将为每个应用程序版本(db_0_0_1,db_0_0_2等等)提供数据库*
  3. 每个"站点"都将在数据库*中具有模式,并且该角色只能访问自己的模式
  4. 应用程序代码主要是PHP和Python中的一些东西(守护进程和维护东西)
  5. Web服务器可能是Nginx和lighttpd或node.js,作为长轮询任务的支持(例如聊天)
  6. 缓存将使用memcached(加上apc用于与php代码严格相关的内容,因为它可以在php外部使用)

database postgresql optimization scaling

6
推荐指数
1
解决办法
2755
查看次数

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

为什么C#内联函数不带struct结构参数?

http://blogs.msdn.com/ericgu/archive/2004/01/29/64717.aspx上,我们了解到C#不会将带有结构的方法作为形式参数进行内联.这是由于对堆栈的潜在依赖,例如递归吗?如果是这样,我可以通过将struct参数转换为这样的ref参数来获益吗?

public int Sum(int i)
{
  return array1[i] + array2[i];
}
Run Code Online (Sandbox Code Playgroud)

变成:

public int Sum(ref int i)
{
  return array1[i] + array2[i];
}
Run Code Online (Sandbox Code Playgroud)

编辑:我去尝试测试,但我无法获得任何内联.这是我尝试过的:

class Program
{
  private static string result;
  static void Main(string[] args)
  {
    Console.WriteLine(MethodBase.GetCurrentMethod().Name);
    Console.WriteLine();
    m1();
    Console.WriteLine(result);
  }
  private static void m1()
  {
    result = MethodBase.GetCurrentMethod().Name;
  }
}
Run Code Online (Sandbox Code Playgroud)

它打印"m1"作为第二行,表示它没有内联.我构建了一个Release版本并使用Ctrl-F5运行它(不附加调试器).有任何想法吗?

.net c# optimization inline

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

如何在C#中使用int64标记对数组的一部分进行排序?

.Net框架有一个Array.Sort重载,允许用户指定要处理的排序的起始和结束标记.但是这些参数只有32位.因此,当描述排序范围的标记只能使用64位数字指定时,我没有看到对大型数组的一部分进行排序的方法.我想我可以复制和修改框架的排序实现,但这并不理想.

更新:

我已经创建了两个类来帮助我解决这些问题和其他大型数组问题.另一个这样的问题是,在我达到内存限制之前,我开始得到OutOfMemoryException.我假设这是因为请求的内存可用但不连续.因此,我创建了类BigArray,它是一个通用的,动态大小的数组列表.它具有比框架的通用列表类更小的内存占用,并且不要求整个数组是连续的.我没有测试过性能,但我确信它存在.

  public class BigArray<T> : IEnumerable<T>
  {
    private long capacity;
    private int itemsPerBlock;
    private int shift;
    private List<T[]> blocks = new List<T[]>();

    public BigArray(int itemsPerBlock)
    {
      shift = (int)Math.Ceiling(Math.Log(itemsPerBlock) / Math.Log(2));
      this.itemsPerBlock = 1 << shift;
    }

    public long Capacity
    {
      get
      {
        return capacity;
      }
      set
      {
        var requiredBlockCount = (value - 1) / itemsPerBlock + 1;
        while (blocks.Count > requiredBlockCount)
        {
          blocks.RemoveAt(blocks.Count - 1);
        }
        while (blocks.Count < requiredBlockCount)
        {
          blocks.Add(new T[itemsPerBlock]);
        }
        capacity = (long)itemsPerBlock …
Run Code Online (Sandbox Code Playgroud)

.net c# arrays sorting int64

4
推荐指数
1
解决办法
1271
查看次数