在python中,当对象占用比数据本身更多的内存空间时,优化列表对象的好方法是什么
在python中,当对象占用比数据本身更多的内存空间时,优化列表对象的好方法是什么在python中,当对象占用比数据本身更多的内存空间时,优化列表对象的好方法是什么,python,string,list,Python,String,List,在python中,当对象占用比数据本身更多的内存空间时,优化列表对象的好方法是什么 假设我们有100M个字符串列表对象(可能来自long_string.split('\t')),每个字符串对象只包含几个字节的字符串数据,但对象本身需要几十个内存。python中有哪些好的替代解决方案?一个好的方法可能是不立即将它们存储在内存中,例如通过使用可按需生成对象的方法。一个好的方法可能是不立即将它们存储在内存中,例如通过使用可按需生成对象的方法 def split_lines(text): tem
假设我们有100M个字符串列表对象(可能来自long_string.split('\t')),每个字符串对象只包含几个字节的字符串数据,但对象本身需要几十个内存。python中有哪些好的替代解决方案?一个好的方法可能是不立即将它们存储在内存中,例如通过使用可按需生成对象的方法。一个好的方法可能是不立即将它们存储在内存中,例如通过使用可按需生成对象的方法
def split_lines(text):
temp = ''
for char in text:
if (char != '\n'):
temp += char
else:
yield temp
temp = ''
for each in split_lines(text):
#process each line
我检查,这是有效的,但它似乎比仅仅使用更长的时间
for each in text.split('\n'):
#process each line
但它节省了大量内存空间,因为文本数据中有数十亿行
我检查,这是有效的,但它似乎比仅仅使用更长的时间
for each in text.split('\n'):
#process each line
但它节省了大量内存空间,因为文本数据中有数十亿行 我认为主要的问题是你在内存中读取整个文件,如果可能的话,你应该将文件分块读取并处理它们
file_object = open('filename', 'r')
while True:
line = file_object.readline()
if not line: break
process_line(line)
我认为主要的问题是你在内存中读取整个文件,如果可能的话,你应该分块读取文件并处理它们
file_object = open('filename', 'r')
while True:
line = file_object.readline()
if not line: break
process_line(line)
要一次处理多行大文件中的一行,请执行以下操作:
def main():
with open('input_file.txt') as file:
for line in file:
process_line(line)
如果文件包含数字(例如,每行一个短整数),并且您需要所有数字,那么您可以使用:
从functools导入部分
从itertools导入imap
将numpy作为np导入
def计数_行(文件):
“”“返回文件中的行数。”“”
返回iter中块的总和(chunk.count('\n')(partial(file.read,1),一次处理多行大文件中的一行:
def main():
with open('input_file.txt') as file:
for line in file:
process_line(line)
如果文件包含数字(例如,每行一个短整数),并且您需要所有数字,那么您可以使用:
从functools导入部分
从itertools导入imap
将numpy作为np导入
def计数_行(文件):
“”“返回文件中的行数。”“”
iter(partial)(file.read,1)中chunk的返回和(chunk.count('\n')。您在问什么?您在问什么数据结构最能有效地存储许多(在您的示例中为1亿)对象(字符串)?是的,如果有。这取决于你的应用程序。你真的需要将元素存储在内存中吗?你会在整个数据集上迭代一次吗?不止一次?现有生成器的答案可能对某些情况最好,但对某些应用程序可能不起作用。你的应用程序在做什么?你在问什么?你在问什么数据结构将是存储许多(在您的示例中为1亿)对象(字符串)的最有效方法?是的,如果有。这取决于你的应用程序。你真的需要将元素存储在内存中吗?你会在整个数据集上迭代一次吗?不止一次?现有生成器的答案可能对某些情况最好,但对某些应用程序可能不起作用。你的应用程序在做什么?这当然是一个解决方案。但是,我我认为这将花费许多I/O操作。关键是,我可以加载所有数据(仅数百MB),但我可能无法将文本拆分为数十亿个字符串对象(这将花费GB的内存空间,比原始数据多出几倍)。因此,将数据加载到内存并使用生成器处理可能是最有效的方法。您可以将其作为写入文件中的行\u对象:进程\u行(行)
@chentingpc您是否尝试使用此方法测量运行时间?顺便说一句,如果您想提高IO速度,您也可以获取更大的批处理。当然,这是一个解决方案。但是,我认为这将花费许多I/O操作。关键是,我可以加载所有数据(仅数百MB),但我可能负担不起将文本拆分为数十亿个字符串对象(这将占用GBs的内存空间,比原始数据多出几倍)。因此,将数据加载到内存并使用生成器处理可能是最有效的方法。您可以将其作为写入文件中的行\u对象:进程\u行(行)
@chentingpc您是否尝试使用此方法测量所用时间?顺便说一句,如果您想提高IO速度,您还可以获取更大的批处理拆分行()
可能是一个更好的名称(您的代码将文本拆分成几行;它不会拆分行)
拆分行()
可能是一个更好的名称(您的代码将文本
拆分为几行;它不会拆分一行)。