我有UTF-8和mb_strtoupper的问题.
mb_internal_encoding('UTF-8');
$guesstitlestring='Le Courrier de Sáint-Hyácinthe';
$encoding=mb_detect_encoding($guesstitlestring);
if ($encoding!=='UTF-8') $guesstitlestring=mb_convert_encoding($guesstitlestring,'UTF-8',$encoding);
echo "DEBUG1 $guesstitlestring\n";
$guesstitlestring=mb_strtoupper($guesstitlestring);
echo "DEBUG2 $guesstitlestring\n";
结果:
DEBUG1 Le Courrier de Sáint-Hyácinthe
DEBUG2 LE COURRIER DE S?INT-HY?CINTHE
我不明白为什么会这样?我正在尝试尽可能小心地使用编码.该字符串首先作为UTF-8给出,经过验证并可能重新转换为UTF-8.这是一场噩梦!
UPDATE
所以我发现这是由于我通过控制台输入参数和从控制台返回的参数的组合引起的.所以他们在前进和出路的路上都是乱码.解决方案是不以这种方式输入任何参数,或以这种方式获取参数.
感谢大家帮忙解决这个问题!
我在Golang中遇到问题,我需要能够查找大约5,000,000个字符串的字符串键,每个字符串只包含az(小写)和0-9个字符.与uint32和uint64类似的问题作为键.
地图(哈希表)是完美的,但它使用了太多的RAM.
对于这种类型的东西必须有已知的方法,我一直在研究B-Tree,但我不确定它是最有效的机制.
我的问题的一些特殊性,可以导致更有效的解决方案,是:
因为它只需要是只读的,所以在我看来,将它作为带有一系列索引的预排序列表,可能会运行良好.我一开始以为我可能只能在每个级别(即字符)中使用36(26个字母+10个数字)索引进行切片...但当然这意味着36 ^无论哪个最终与...相反高效.然后我想也许我可以为每个级别只放一个36的索引,但最后我需要交叉一组数组/切片来获取结果的ID.
我想我正在寻找某种非常具体的B-Tree实现,但更多地关注我的目的(没有B.)
有谁知道我所建议的任何存在的东西?
我有一个持续运行的Go程序,完全依赖于goroutines + 1 manager线程.主线程只调用goroutines然后休眠.
有内存泄漏.该程序使用越来越多的内存,直到它耗尽所有16GB RAM + 32GB SWAP,然后每个goroutine恐慌.它实际上是操作系统内存导致恐慌,通常恐慌是fork/exec ./anotherapp: cannot allocate memory我尝试执行时anotherapp.
发生这种情况时,所有工作线程都会发生混乱并恢复并重新启动.所以每个goroutine都会惊慌失措,恢复并重新启动......此时内存使用量不会减少,即使现在几乎没有任何分配,它仍然保持在48GB.这意味着所有goroutine总是会因为没有足够的内存而恐慌,直到整个可执行文件被杀死并完全重启.
整个事情大概是50,000行,但实际问题区域如下:
type queue struct {
    identifier string
    type bool
}
func main() {
    // Set number of gorountines that can be run
    var xthreads int32 = 10
    var usedthreads int32
    runtime.GOMAXPROCS(14)
    ready := make(chan *queue, 5)
    // Start the manager goroutine, which prepared identifiers in the background ready for processing, always with 5 waiting to go
    go manager(ready)
    // Start creating …我有扫描书的PDF,图像是JBIG2格式(B&W).我想将其转换为矢量PDF,我可以通过提取图像并将其转换为使用potrace的PDF矢量图形指令轻松完成.
这样做的原因是我希望PDF能够在电子书阅读器设备(如Kindle)上流畅而快速地显示.对于JBIG2,它并没有做得很好.根据设置,Kindle无法显示PDF,即使修复了这一点,渲染每个页面也需要很长时间.使用矢量PDF,性能更好,渲染非常清晰.
问题是生成的PDF在文件大小中是巨大的.即使流gz压缩到最大,每页300KB(原始JBIG2图像每页30KB).
有什么方法可以优化矢量图形,以便文件大小更少?
以下是矢量绘图说明的一部分:
0.100000 0.000000 0.000000 0.100000 0.000000 0.000000 cm
0 g
8277 29404 m
8263 29390 8270 29370 8289 29370 c
8335 29370 8340 29361 8340 29284 c
8340 29220 8338 29210 8323 29210 c
8194 29207 8141 29208 8132 29214 c
8125 29218 8120 29248 8120 29289 c
8120 29356 8121 29358 8150 29370 c
8201 29391 8184 29400 8095 29400 c
8004 29400 7986 29388 8033 29357 c
8056 29342 8057 29338 8057 29180 c …使用strlen实际上是通过迭代字符串来计算字符串中的字节数,还是简单地从索引返回已经计算的字符串长度的值?
我的问题的原因是因为我可以选择为速度敏感的脚本存储非常长字符串的预先计算值,或者我可以使用该strlen函数并节省自己的编码时间.
但我真的想知道我是如何strlen工作的,因为我倾向于依赖它,也许这不是一个好主意?
UPDATE
请参阅下面的基准.
自PDF规范1.4起,PDF格式支持JBIG2图像.因此,所有PDF阅读器应用程序都可以读取JBIG2图像.我可以确认包含JBIG2图像的PDF在iPhone和iPad上正确呈现.
我想要做的是从Objective-C渲染(或转换为PNG)JBIG2图像,而不必在PDF中.JBIG2图像以普通图像对象的形式存储在PDF文件中,采用自己的JBIG2原始格式(不进行任何类型的转换),因此很明显,iOS中的某处有一个JBIG2解码器库,否则这些无法解码.
那么如何在iOS上渲染JBIG2图像而不将该图像放在PDF包装器中呢?它与PDF图像对象中存在的数据完全相同,因此它将使用完全相同的解码器.
在JBIG2图像周围添加一个小小的PDF包装器只是为了能够将其渲染出来,这将浪费大量资源.这个JBIG2解码器必须存在于iOS中的某个地方,那么如何使用它呢?
UPDATE
如果JBIG2解码器在iOS中本身不可用那么这意味着PDF阅读器正在使用它们自己...在这种情况下,应该可以将解码器从开源PDF阅读器中删除.
以下是包含JBIG2和原始JIBG2的PDF示例:http://www.filedropper.com/jbig2samples
我目前正在将一个struct保存到文件中,以便可以加载它,然后通过实现gob来使用,如下所示:
func (t *Object) Load(filename string) error {
    fi, err := os.Open(filename)
    if err !=nil {
        return err
    }
    defer fi.Close()
    fz, err := gzip.NewReader(fi)
    if err !=nil {
        return err
    }
    defer fz.Close()
    decoder := gob.NewDecoder(fz)
    err = decoder.Decode(&t)
    if err !=nil {
        return err
    }
    return nil
}
func (t *Object) Save(filename string) error {
    fi, err := os.Create(filename)
    if err !=nil {
        return err
    }
    defer fi.Close()
    fz := gzip.NewWriter(fi)
    defer fz.Close()
    encoder := gob.NewEncoder(fz)
    err = …通过在任何函数之外定义对象,我可以轻松地使对象成为全局对象,但这对于必须创建的某些结构不起作用.
我想要做的是这个更复杂的版本:
package main
import "regexp"
func doSomething(test []byte) []byte {
   test = reg.ReplaceAll(test,nil)
   return test
}
reg, _ := regexp.Compile(`[^a-z\s]`) // this is the issue
func main() {
   thing := doSomething("somebytes")
}
显然上面是不允许的,但这就是我想做的事情.
似乎没有任何方法reg可以在doSomething不传递的情况下从函数内部访问该对象,我想避免这种情况,因为我将要做几十亿次.
如果我把它放进去,main()它就不再是全球性的了.我甚至试过这个:
var reg regexp.Regexp
func main() {
   reg, _ = regexp.Compile(`[^a-z\s]`)
   thing := doSomething("somebytes")
}
......但这也不起作用,它给了我一个错误.
有任何想法吗?
更新:我的问题实际上不是正则表达式.那就是一个例子.
我非常非常小心记忆,因为我必须编写需要处理大量数据集的程序。
\n\n目前我的应用程序很快就达到了 32GB 内存,开始交换,然后被系统杀死。
\n\n我不明白这是怎么回事,因为除了结构体之外,所有变量都是可收集的(在函数中并快速TokensStruct释放TokensCount)Trainer。TokensCount只是一个单位。TokensStruct是 [5]uint32 和字符串的 1,000,000 行切片,因此这意味着 20 个字节 + 字符串,我们可以称之为每条记录最多 50 个字节。50*1000000 = 需要 50MB 内存。因此,该脚本不应在函数中使用超过 50MB + 开销 + 临时可收集变量(最多可能还有 50MB)。 的最大潜在大小TokensStruct是 5,000,000,因为这是 的大小dictionary,但即使如此,它也只有 250MB的记忆。dictionary是一张地图,显然使用了大约 600MB 的内存,因为这就是应用程序的启动方式,但这不是问题,因为dictionary只加载一次,再也不会写入。
相反,它使用 32GB 内存然后就死掉了。从它执行此操作的速度来看,如果可以的话,我预计它会很乐意达到 1TB 内存。内存似乎随着加载文件的大小以线性方式增加,这意味着它似乎永远不会清除任何内存。进入应用程序的所有内容都会分配更多内存,并且内存永远不会被释放。
\n\n我尝试实施runtime.GC()以防垃圾收集运行得不够频繁,但这没有什么区别。
由于内存使用量以线性方式增加,因此这意味着GetTokens()或中存在内存泄漏LoadZip()。我不知道这是怎么回事,因为它们都是函数,只执行一项任务然后关闭。或者可能是tokensin 中的变量Start()是泄漏的原因。基本上,看起来加载和解析的每个文件都永远不会从内存中释放,因为这是内存以线性方式填满并继续上升到 32GB++ 的唯一方法。
绝对的噩梦!Go 有什么问题吗?有任何解决这个问题的方法吗?
\n\npackage main\n\nimport …假设我有一个用户搜索查询,如下所示:
"the happy bunny"
我已经计算了 tf-idf 并为我正在搜索的每个文档提供了类似的内容(以下是示例值)(当然 idf 始终相同):
        tf      idf    score
the     0.06    1      0.06 * 1 = 0.06
happy   0.002   20     0.002 * 20 = 0.04
bunny   0.0005  60     0.0005 * 60 = 0.03
我有两个问题关于下一步该怎么做。
首先,the仍然具有最高分数,尽管 idf 根据稀有性进行了调整,但它仍然不是很重要 - 您认为我应该idf根据稀有词对值进行平方权重,还是会产生不好的结果?否则,我担心 与和the同等重要,而且很明显,它是搜索中最重要的词。只要稀有总是等于重要,那么根据稀有程度进行加权总是一个好主意,但如果情况并非总是如此,那么这样做可能真的会弄乱结果。happybunnybunny
其次,更重要的是:将每个单词的分数组合在一起以给每个文档一个表示其反映整个搜索查询的程度的单个分数的最佳/首选方法是什么?我正在考虑添加它们,但很明显,这将为包含 10,000happy但仅 1的文档提供更高的优先级bunny,而不是另一个包含500happy 和 500 的文档bunny(这将是更好的匹配)。