我正在尝试将几个文件加载到内存中.这些文件具有以下3种格式之一:
实际上,它们是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行保持稳定,除了一个目前有数百万行的文件.
所以我想要一个技术/数据结构来减少内存消耗:
非常感谢你.我期待着你的建议.
在此之前,让我首先澄清一下,由于我的知识有限,以下的想法纯粹是我的个人意见.我没有任何意图说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中,我认为第一种方式在含义上是明确的,在效率方面还可以,因为它通过引用传递内容)
我正在使用以下代码来创建新联系人.它紧跟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)
我努力搜索但尚未找到答案.我找到了一个答案,表明问题可能与我的字符串"帐户类型"和"帐户名称"有关.就我而言,我不需要创建任何帐户.我想要的是添加一个新的联系人姓名,电子邮件/邮件地址,电话.
多谢你们!
让我们看一下我无意中写的下面一段代码:
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以获得预期的输出.