我有一个应用程序,我正在阅读和写入数小块数据(几百字节)数亿次.我想基于示例数据文件生成压缩字典,并在读取和写入小块时永远使用该字典.我倾向于LZW压缩算法.维基百科页面(http://en.wikipedia.org/wiki/Lempel-Ziv-Welch)列出了压缩和解压缩的伪代码.修改它看起来相当简单,因此字典创建是一个单独的代码块.所以我有两个问题:
谢谢.
更新: 现在我认为理想的情况是找到一个库,让我将字典与压缩数据分开存储.这样的事情存在吗?
更新: 我最终获取了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) 我试图在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) 我的应用程序分配了大量的内存(数百万个小对象,总计几千兆字节)并且长时间保留它.
更新:Perf计数器"GC中的%时间"显示平均值为10.6%.
我试图在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?
通常(在Windows 7中),安装程序将要求修改系统的权限.作为管理员,我可以在不提供密码的情况下授予授权.
我试图找出如何从作为AN管理员的用户运行的C#代码中采取管理员操作(重新启动IIS),而不是"管理员"帐户.
我没有使用Cygwin或MinGW,但我需要最终得到64位代码,而不是32位代码.这是因为我将从64位托管C#调用DLL.我似乎无法找到设置这些工具来创建64位二进制文件的好参考.如果GCC是版本4,而不是我的Cygwin安装版本3,那将是很好的.
另一种方法是进行某种形式的进程间通信.我会研究这个,但我上面列出的是我真正想要的.
我知道这是一个非常通用和主观的问题,所以如果它不符合StackOverflow网络礼节,请随意投票关闭它...但对我来说,值得尝试;)
我从来没有建立过高流量的应用程序,所以我不知道(除了网上的一些阅读)关于扩展实践.
如何设计一个数据库,当需要扩展时,我不必重构数据库结构或应用程序代码?
我知道开发(和优化)应该逐步进行,在发生时优化瓶颈,并且当你不知道你将拥有多少用户以及他们将如何使用时,几乎不可能设计出完美的结构.数据库(例如读/写比率),我只是想找个好的基础来开始.
没有什么方法让几乎可以与缩放结构的最佳实践partitioning和sharding,什么hacks必须绝对避免?
编辑我的应用程序的一些细节:
在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框架有一个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)