小编Pau*_*ang的帖子

Python:减少字典的内存使用量

我正在尝试将几个文件加载到内存中.这些文件具有以下3种格式之一:

  • string TAB int
  • 字符串TAB浮点数
  • int TAB float.

实际上,它们是ngram静态文件,以防这有助于解决方案.例如:

i_love TAB 10
love_you TAB 12
Run Code Online (Sandbox Code Playgroud)

目前,我正在做的伪代码是

loadData(file):
     data = {}
     for line in file:
        first, second = line.split('\t')
        data[first] = int(second) #or float(second)

     return data
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,虽然磁盘中文件的总大小约为21 MB,但当加载到内存中时,该过程需要120 - 180 MB的内存!(整个python应用程序不会将任何其他数据加载到内存中).

只有不到10个文件,大多数文件在大约50-80k行保持稳定,除了一个目前有数百万行的文件.

所以我想要一个技术/数据结构来减少内存消耗:

  • 有关压缩技术的建议吗?
  • 如果我仍然使用dict,有没有办法减少内存?是否可以像Java dict中那样设置"加载因子"?
  • 如果你有其他一些数据结构,我也愿意交换一些速度来减少内存.然而,这是一个时间敏感的应用程序,所以一旦用户输入他们的查询,我认为花费超过几秒钟来返回结果是不太合理的.关于这一点,我仍然惊讶于谷歌如何设法如此快速地进行谷歌翻译:他们必须使用大量技术+大量服务器的力量?

非常感谢你.我期待着你的建议.

python memory compression dictionary n-gram

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

来自Java视图的C++:我一定错过了一些东西

在此之前,让我首先澄清一下,由于我的知识有限,以下的想法纯粹是我的个人意见.我没有任何意图说C++不酷.

我已经编程C++一年了,我认为它确实有一些很酷的功能.然而,我觉得有点空虚和失望,因为我没有真正从C++中学到任何"改变思维"的东西,从一个碰巧以前学过Java(作为第一语言)的人的角度来看.

根据我读过的很多帖子,人们更喜欢C++,因为它更快.对于像我这样没有编写过时间关键应用程序的程序员,我还没有机会欣赏这一点.

到目前为止,我所学到的似乎都是关于语法的.这就是我们用Java编写类的方法,以及如何用C++编写它.这是如何在Java中继承,以及在C++中如何做等等.(我知道,多重继承很酷,但对我而言,并不是一个改变思维的事情.我认为很酷的是能够回答为什么Java没有/不能支持多重继承,这应该是更通用的比单继承).

不知何故,对我来说,所有这些只是语法,到目前为止,我的思想在编写C++之后似乎没有增长.我认为我的问题是用"Java-mind"编写C++程序.正如许多人所说,我真正想要的是在学习一门新语言后改变我的思维方式.我还没有用我的C++来解决这个问题.

我还可以编写几个小的Python程序.但是,我觉得害怕对它有更多的了解,再次,它只是学习一种新的语法,一种新的做事方式,只是不同而不知道原因.

我打算学习C来真正了解事情.我认为这将是一种非常"涉及"的语言.

让我知道你的想法,请给我一些建议.

PS:顺便说一句,C++中有一个我想确认的特定问题.在C++中,如果我是正确的,以下面的方式写入效率不高:

    private A computeAndReturnA(){...} 
Run Code Online (Sandbox Code Playgroud)

相反,将其写为:

private void computeAndReturnA(A& a){...}
Run Code Online (Sandbox Code Playgroud)

与第一种方式一样,复制返回的值(当我们指定b = compute ...时)并引入一些低效率?(在Java中,我认为第一种方式在含义上是明确的,在效率方面还可以,因为它通过引用传递内容)

c++ java programming-languages

7
推荐指数
1
解决办法
397
查看次数

使用ContactsContract创建的新联系人不会显示在"联系人"应用中

我正在使用以下代码来创建新联系人.它紧跟Android提供的ContactManager示例.问题是,创建的联系人不会出现在Android附带的"联系人"应用中.然而,当我从电话簿加载所有联系人时,我可以看到新创建的联系人.

private void insertPBEntry()抛出RemoteException,OperationApplicationException {

     ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

     ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
             .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, "Account type")
             .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, "Account name")
             .build());

     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,
                     ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "TOTAL_NEW")
             .build());
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,
                     ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "9090")
             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_MOBILE)
             .build());     
     getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

}
Run Code Online (Sandbox Code Playgroud)

我努力搜索但尚未找到答案.我找到了一个答案,表明问题可能与我的字符串"帐户类型"和"帐户名称"有关.就我而言,我不需要创建任何帐户.我想要的是添加一个新的联系人姓名,电子邮件/邮件地址,电话.

多谢你们!

android contactscontract

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

C++:在迭代中重用的浮点值

让我们看一下我无意中写的下面一段代码:

void test (){
for (int i = 1; i <=5; ++i){
    float newNum;
    newNum +=i;
    cout << newNum << " "; 
}
}
Run Code Online (Sandbox Code Playgroud)

现在,这就是我脑子里发生的事情:我一直认为浮动newNum会为每次迭代创建一个新变量newNum,因为该行被放入循环中.由于float newNum不会抛出编译错误,因此C++必须分配一些默认值(huhm,必须为0).然后我预计输出为"1 2 3 4 5".印刷的是"1 3 6 10 15".

请帮助我知道我的期望是什么,浮动newNum会为每次迭代创建一个新变量?

顺便说一句,在Java中,由于newNum没有初始化,这段代码将无法编译,这对我来说可能更好,因为我知道我需要将其设置为0以获得预期的输出.

c++

0
推荐指数
1
解决办法
404
查看次数